470 lines
12 KiB
C++
470 lines
12 KiB
C++
#include "Hd_SocketModule_InovanceH5UTcp.h"
|
|
#include "qprocess.h"
|
|
|
|
|
|
static QQueue<QByteArray> ReadPack;
|
|
//static QVector<System::String^> Failed_address;
|
|
//static QVector<System::String^> Failed_address;
|
|
static QQueue<QByteArray> Failed_data;
|
|
|
|
QMutex* sendData_Mutex = new QMutex();
|
|
QMutex* recive_Mutex = new QMutex();
|
|
Hd_SocketModule_InovanceH5UTcp* create()
|
|
{
|
|
qDebug() << "Hd_SocketModule_InovanceH5UTcp create success!";
|
|
return new Hd_SocketModule_InovanceH5UTcp;
|
|
}
|
|
|
|
void destory(Hd_SocketModule_InovanceH5UTcp* ptr)
|
|
{
|
|
|
|
if (ptr)
|
|
{
|
|
delete ptr;
|
|
ptr = nullptr;
|
|
}
|
|
qDebug() << " Hd_SocketModule_InovanceH5UTcp destory success!";
|
|
}
|
|
bool ifRun = true;
|
|
Hd_SocketModule_InovanceH5UTcp::Hd_SocketModule_InovanceH5UTcp()
|
|
{
|
|
ifRun = true;
|
|
*m_InovanceTcpNet = gcnew HslCommunication::Profinet::Inovance::InovanceH5UTcp();
|
|
}
|
|
bool m_IsKeyenceMcTcp = false;
|
|
Hd_SocketModule_InovanceH5UTcp::~Hd_SocketModule_InovanceH5UTcp()
|
|
{
|
|
ifRun = false;
|
|
Sleep(100);
|
|
if (m_IsKeyenceMcTcp)
|
|
{
|
|
if ((*m_InovanceTcpNet)->ConnectClose()->IsSuccess)
|
|
{
|
|
qDebug() << " (*m_pFinsTcpNet)->ConnectClose() success!";
|
|
}else {
|
|
qCritical() << " (*m_pFinsTcpNet)->ConnectClose() failed!";
|
|
}
|
|
m_IsKeyenceMcTcp = false;
|
|
}
|
|
qDebug() << " ~Hd_SocketModule_InovanceH5UTcp success!";
|
|
}
|
|
|
|
// 从类中读数据到实例对象
|
|
bool Hd_SocketModule_InovanceH5UTcp::readData(std::vector<cv::Mat>& vec_mat, QByteArray& data)
|
|
{
|
|
Q_UNUSED(vec_mat);
|
|
QMutexLocker locker(sendData_Mutex);
|
|
|
|
QByteArray statusVaule;
|
|
/*if (tcp_Status)
|
|
{
|
|
statusVaule = "truee";
|
|
}
|
|
else
|
|
{
|
|
statusVaule = "false";
|
|
}*/
|
|
|
|
if (ReadPack.isEmpty())
|
|
{
|
|
//data = statusVaule;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
//data.append(statusVaule);
|
|
data.append(ReadPack.dequeue());
|
|
//qDebug() << " ReadPack len: " << ReadPack.length() << " data: " << data;
|
|
}
|
|
return true;
|
|
}
|
|
bool ifRetryCMD = false;
|
|
// 实例对象把数据写入到类
|
|
bool Hd_SocketModule_InovanceH5UTcp::writeData(std::vector<cv::Mat>& vec_mat, QByteArray& data)
|
|
{
|
|
Q_UNUSED(vec_mat);
|
|
if(ifRetryCMD==false)
|
|
QMutexLocker locker(recive_Mutex);
|
|
Sleep(sleepvalue);
|
|
QString str = QString(data);
|
|
if ( data.isEmpty() )
|
|
{
|
|
qCritical() << " str is null";
|
|
return false;
|
|
}
|
|
|
|
QList<QByteArray> m_list = data.split('_');
|
|
|
|
QString m_value;
|
|
QString commond = m_list.at(0);
|
|
if ( commond == "init" ){
|
|
System::String^ Code = gcnew System::String("b5f8f9f7-c075-4913-ae6e-d7d2cc6f2de1");
|
|
if (HslCommunication::Authorization::SetAuthorizationCode(Code))
|
|
{
|
|
std::cout << "Register HSLCode Success" << std::endl;
|
|
}
|
|
else
|
|
{
|
|
std::cout << "Register HSLCode Fail" << std::endl;
|
|
}
|
|
|
|
if (m_list.length() < 3)
|
|
{
|
|
qCritical() << " m_list failed! " << m_list;
|
|
return false;
|
|
}
|
|
|
|
m_IP = m_list.at(1);
|
|
m_port = m_list.at(2);
|
|
}else if (commond == "read") {
|
|
|
|
while (ifRun)
|
|
{
|
|
Sleep(20); // 读取速度过快,添加10ms延时
|
|
|
|
int length = m_list[2].toInt();
|
|
System::String^ address = gcnew System::String(m_list[1].remove(1, 1).toStdString().c_str());
|
|
|
|
HslCommunication::OperateResult<cli::array<unsigned char>^>^ result = (*m_InovanceTcpNet)->Read(address, length);
|
|
if (!result->IsSuccess)
|
|
{
|
|
tcp_Status = false;
|
|
qCritical() << " (*FinsTcp)->ReadInt16 failed! check DA1: " << DA1;
|
|
|
|
QProcess pingProcess;
|
|
QString strArg = "ping " + m_IP + " -n 1 -i 2"; //strPingIP 为设备IP地址
|
|
pingProcess.start(strArg, QIODevice::ReadOnly);
|
|
pingProcess.waitForFinished(-1);
|
|
|
|
QString p_stdout = QString::fromLocal8Bit(pingProcess.readAllStandardOutput());
|
|
|
|
//qDebug() << p_stdout;
|
|
bool bPingSuccess = false;
|
|
|
|
if (p_stdout.contains("TTL=")) //通过特殊字符串进行判断ping是否成功
|
|
{
|
|
//printf("Ping true\n");
|
|
bPingSuccess = true;
|
|
//QMessageBox::information(this, "ping PLC:", "success!");
|
|
//qCritical() << __FUNCTION__ << " line:" << __LINE__ << " ping PLC success! ";
|
|
}
|
|
else
|
|
{
|
|
/*printf("Ping false\n");
|
|
bPingSuccess = false;
|
|
QMessageBox::information(this, "ping PLC:", "failed!");*/
|
|
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " ping PLC failed! ";
|
|
}
|
|
//
|
|
Failed_data.enqueue(data);
|
|
//if (m_IsKeyenceMcTcp)
|
|
{
|
|
//(*m_pFinsTcpNet)->Dispose();
|
|
//qDebug() << " (*m_pFinsTcpNet)->Dispose() success!";
|
|
|
|
if ((*m_InovanceTcpNet)->ConnectClose()->IsSuccess)
|
|
{
|
|
qDebug() << " (*m_pFinsTcpNet)->ConnectClose() success!";
|
|
}
|
|
else {
|
|
qCritical() << " (*m_pFinsTcpNet)->ConnectClose() failed!";
|
|
}
|
|
//m_IsKeyenceMcTcp = false;
|
|
delete* m_InovanceTcpNet;
|
|
Sleep(50);
|
|
*m_InovanceTcpNet = gcnew HslCommunication::Profinet::Inovance::InovanceH5UTcp();
|
|
(*m_InovanceTcpNet)->IpAddress = gcnew System::String(m_IP.toStdString().c_str());
|
|
(*m_InovanceTcpNet)->Port = stoi(m_port.toStdString());
|
|
Sleep(10);
|
|
}
|
|
|
|
//if ((*m_pFinsTcpNet)->ConnectClose()->IsSuccess)
|
|
//{
|
|
// qDebug() << " (*m_pFinsTcpNet)->ConnectClose() success!";
|
|
//}
|
|
//else {
|
|
// qCritical() << " (*m_pFinsTcpNet)->ConnectClose() failed!";
|
|
//}
|
|
int xunhuan_num = 20;
|
|
while (xunhuan_num) {
|
|
qDebug() << " TRY xunhuan_num: "<< xunhuan_num;
|
|
(*m_InovanceTcpNet)->ConnectTimeOut = 1000; // 连接超时2秒
|
|
(*m_InovanceTcpNet)->ReceiveTimeOut = 500; // 收发超时0.5秒
|
|
if ((*m_InovanceTcpNet)->ConnectServer()->IsSuccess)
|
|
{
|
|
m_IsKeyenceMcTcp = true;
|
|
tcp_Status = true;
|
|
/*QVector<short> Writefailpack;
|
|
for (QVector<short>::iterator ii = WriteFailPack.begin(); ii != WriteFailPack.end(); ii++)
|
|
{
|
|
for (int val = 0; val < 5; val++)
|
|
{
|
|
if (!(*m_pFinsTcpNet)->Write(address, ii)->IsSuccess)
|
|
{
|
|
if (val == 4) Writefailpack.push_back(*ii);
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
WriteFailPack.clear();
|
|
WriteFailPack = Writefailpack;
|
|
Writefailpack.clear();*/
|
|
qDebug() << " Connect Success! SA1: " << SA1 << "DA1 :" << DA1;
|
|
|
|
ifRetryCMD = true;
|
|
for (int i = 0; i < Failed_data.size(); i++)
|
|
{
|
|
QByteArray try_data = Failed_data.dequeue();
|
|
std::vector<cv::Mat> my_vec_mat;
|
|
qDebug() << " try_data:: " << try_data;
|
|
writeData(my_vec_mat, try_data);
|
|
Sleep(10);
|
|
}
|
|
ifRetryCMD = false;
|
|
return tcp_Status;
|
|
}
|
|
else
|
|
{
|
|
xunhuan_num--;
|
|
/*if (SA1 > 255)
|
|
SA1 = 50;
|
|
SA1 = QString::number(SA1.toInt() + 1);
|
|
if (DA1 > 255)
|
|
DA1 = 50;
|
|
DA1 = QString::number(DA1.toInt() + 1);*/
|
|
tcp_Status = false;
|
|
//qCritical() << " Connect failed! SA1: " << SA1 << "DA1 : " << DA1;
|
|
Sleep(100);
|
|
}
|
|
|
|
}
|
|
//return false;
|
|
continue;
|
|
}
|
|
|
|
unsigned char* valuePtr = new unsigned char[m_list[2].toInt() * 2];
|
|
QByteArray byte;
|
|
for (int i = 0; i < length * 2; i++)
|
|
{
|
|
valuePtr[i] = result->Content[i];
|
|
char v = result->Content[i];
|
|
byte.append(v);
|
|
}
|
|
|
|
ReadPack.append(byte);
|
|
if (valuePtr) {
|
|
delete[] valuePtr;
|
|
valuePtr = nullptr;
|
|
}
|
|
tcp_Status = true;
|
|
break;
|
|
}
|
|
|
|
}
|
|
else if (commond == "write")
|
|
{
|
|
//例"write_short_D1003_1","write_short_D1003_1,1,1,1",
|
|
if (m_list[1] == "short")
|
|
{
|
|
QString vecValue = m_list.at(3);
|
|
QStringList valueList = vecValue.split(",");
|
|
cli::array<short>^ write_list = gcnew cli::array<short>(valueList.length());
|
|
for (int i = 0; i < valueList.length(); i++)
|
|
{
|
|
write_list[i] = valueList[i].toShort();
|
|
}
|
|
|
|
System::String^ address = gcnew System::String(m_list[2].toStdString().c_str());
|
|
for (auto val = 0; val < 5; val++)
|
|
{
|
|
//Sleep(sleepvalue);
|
|
if (!(*m_InovanceTcpNet)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, write_list)->IsSuccess)
|
|
{
|
|
qCritical() << " val: " << val++ << " writeAll failed! m_list: " << m_list;
|
|
Failed_data.enqueue(data);
|
|
Sleep(sleepvalue);
|
|
}
|
|
else {
|
|
qDebug() << "[TCP] " << str << endl;
|
|
return true;
|
|
}
|
|
}
|
|
tcp_Status = false;
|
|
return false;
|
|
}
|
|
if (m_list[1] == "float")
|
|
{
|
|
QString vecValue = m_list.at(3);
|
|
QStringList valueList = vecValue.split(",");
|
|
cli::array<float>^ write_list = gcnew cli::array<float>(valueList.length());
|
|
for (int i = 0; i < valueList.length(); i++)
|
|
{
|
|
write_list[i] = valueList[i].toFloat();
|
|
}
|
|
|
|
System::String^ address = gcnew System::String(m_list[2].toStdString().c_str());
|
|
for (auto val = 0; val < 5; val++)
|
|
{
|
|
//Sleep(sleepvalue);
|
|
if (!(*m_InovanceTcpNet)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, write_list)->IsSuccess)
|
|
{
|
|
qCritical() << " val: " << val++ << " writeAll failed! m_list: " << m_list;
|
|
Failed_data.enqueue(data);
|
|
Sleep(sleepvalue);
|
|
}
|
|
else {
|
|
qDebug() << "[TCP] " << str << endl;
|
|
return true;
|
|
}
|
|
}
|
|
tcp_Status = false;
|
|
return false;
|
|
}
|
|
if (m_list[1] == "double")
|
|
{
|
|
QString vecValue = m_list.at(3);
|
|
QStringList valueList = vecValue.split(",");
|
|
cli::array<double>^ write_list = gcnew cli::array<double>(valueList.length());
|
|
for (int i = 0; i < valueList.length(); i++)
|
|
{
|
|
write_list[i] = valueList[i].toDouble();
|
|
}
|
|
|
|
System::String^ address = gcnew System::String(m_list[2].toStdString().c_str());
|
|
for (auto val = 0; val < 5; val++)
|
|
{
|
|
//Sleep(sleepvalue);
|
|
if (!(*m_InovanceTcpNet)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, write_list)->IsSuccess)
|
|
{
|
|
qCritical() << " val: " << val++ << " writeAll failed! m_list: " << m_list;
|
|
Failed_data.enqueue(data);
|
|
Sleep(sleepvalue);
|
|
}
|
|
else {
|
|
qDebug() << "[TCP] " << str << endl;
|
|
return true;
|
|
}
|
|
}
|
|
tcp_Status = false;
|
|
return false;
|
|
}
|
|
if (m_list[1] == "string")
|
|
{
|
|
System::String^ address = gcnew System::String(m_list[2].toStdString().c_str());
|
|
System::String^ write_Value = gcnew System::String(m_list.at(3).toStdString().c_str());
|
|
for (auto val = 0; val < 5; val++)
|
|
{
|
|
//Sleep(sleepvalue);
|
|
if (!(*m_InovanceTcpNet)->Write(address, write_Value)->IsSuccess) {
|
|
qCritical() << " val: " << val++ << " writeString failed! m_list: " << m_list;
|
|
Failed_data.enqueue(data);
|
|
Sleep(sleepvalue);
|
|
}
|
|
else {
|
|
qDebug() << "[TCP] " << str << endl;
|
|
return true;
|
|
}
|
|
}
|
|
tcp_Status = false;
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool Hd_SocketModule_InovanceH5UTcp::initParas(QByteArray& data)
|
|
{
|
|
|
|
if (data.isEmpty())
|
|
{
|
|
qWarning()<< "[TCP] " << " data is null!";
|
|
}
|
|
else
|
|
{
|
|
QString initDat = QString::fromUtf8(data);
|
|
QStringList list = initDat.split("_");
|
|
if (list.size() < 3)
|
|
{
|
|
qCritical() << "[TCP] " << " list size error :" << list.size();
|
|
return false;
|
|
}
|
|
|
|
QString sleepname = list.at(0);
|
|
sleepvalue = list.at(1).toInt();
|
|
if (sleepvalue <= 0)
|
|
sleepvalue = 1;
|
|
QString readname = list.at(2);
|
|
QString readvalue = list.at(3);
|
|
QString write_type = list.at(4);
|
|
QString write_value = list.at(5);
|
|
}
|
|
|
|
// 连接通讯
|
|
*m_InovanceTcpNet = gcnew HslCommunication::Profinet::Inovance::InovanceH5UTcp();
|
|
(*m_InovanceTcpNet)->IpAddress = gcnew System::String(m_IP.toStdString().c_str());
|
|
(*m_InovanceTcpNet)->Port = stoi(m_port.toStdString());
|
|
int xunhuan_num = 20;
|
|
while (xunhuan_num) {
|
|
|
|
(*m_InovanceTcpNet)->ConnectTimeOut = 500; // 连接超时0.5秒
|
|
(*m_InovanceTcpNet)->ReceiveTimeOut = 500; // 收发超时0.5秒
|
|
if ((*m_InovanceTcpNet)->ConnectServer()->IsSuccess)
|
|
{
|
|
m_IsKeyenceMcTcp = true;
|
|
tcp_Status = true;
|
|
qDebug() << " Connect Success! SA1: " << SA1;
|
|
return tcp_Status;
|
|
}
|
|
else
|
|
{
|
|
xunhuan_num--;
|
|
SA1 = QString::number(SA1.toInt() + 1);
|
|
tcp_Status = false;
|
|
qCritical() <<" Connect failed! SA1: " << SA1;
|
|
|
|
}
|
|
Sleep(100);
|
|
}
|
|
return tcp_Status;
|
|
|
|
}
|
|
|
|
bool Hd_SocketModule_InovanceH5UTcp::run()
|
|
{
|
|
// 没有用到
|
|
//qDebug() << "[info] " << __FUNCTION__ << " line:" << __LINE__ << " success!";
|
|
return true;
|
|
}
|
|
|
|
|
|
bool Hd_SocketModule_InovanceH5UTcp::decodeWriteResult(QByteArray byte, QVector<QString>& vec_ret)
|
|
{
|
|
try
|
|
{
|
|
if (byte.isEmpty())
|
|
{
|
|
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " byte is null!";
|
|
return false;
|
|
}
|
|
while (!byte.isEmpty())
|
|
{
|
|
int len = 0;
|
|
QByteArray m_len = byte.mid(0, 4);
|
|
memcpy((void*)&len, (void*)m_len.data(), 4);
|
|
byte.remove(0, 4);
|
|
|
|
QByteArray mm_data = byte.mid(0, len);
|
|
vec_ret.append(QString::fromUtf8(mm_data));
|
|
byte.remove(0, len);
|
|
}
|
|
}
|
|
catch (QString ev) {
|
|
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " ev:" << ev;
|
|
return false;
|
|
}
|
|
return true;
|
|
} |