#include "Hd_SocketModule_FinsTcp.h" #include "qprocess.h" static QQueue ReadPack; //static QVector Failed_address; //static QVector Failed_address; static QQueue Failed_data; QMutex* readData_Mutex = new QMutex(); QMutex* recive_Mutex = new QMutex(); Hd_SocketModule_FinsTcp* create() { qDebug() << "Hd_SocketModule_FinsTcp create success!"; return new Hd_SocketModule_FinsTcp; } void destory(Hd_SocketModule_FinsTcp* ptr) { if (ptr) { delete ptr; ptr = nullptr; } qDebug() << " Hd_SocketModule_FinsTcp destory success!"; } bool ifRun = true; Hd_SocketModule_FinsTcp::Hd_SocketModule_FinsTcp() { ifRun = true; *m_pFinsTcpNet = gcnew HslCommunication::Profinet::Omron::OmronFinsNet(); } bool m_IsFinsTcp = false; Hd_SocketModule_FinsTcp::~Hd_SocketModule_FinsTcp() { ifRun = false; Sleep(100); if (status == false) Sleep(3000); if (m_IsFinsTcp) { if ((*m_pFinsTcpNet)->ConnectClose()->IsSuccess) { qDebug() << " (*m_pFinsTcpNet)->ConnectClose() success!"; }else { qCritical() << " (*m_pFinsTcpNet)->ConnectClose() failed!"; } m_IsFinsTcp = false; } qDebug() << " ~Hd_SocketModule_FinsTcp success!"; } // 从类中读数据到实例对象 bool Hd_SocketModule_FinsTcp::readData(std::vector& vec_mat, QByteArray& data) { Q_UNUSED(vec_mat); QMutexLocker locker(readData_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_FinsTcp::writeData(std::vector& 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 m_list = data.split('_'); if (m_list.size() < 4) { qCritical() << data+" m_list.size() != 4;command err"; return false; } QString m_value= m_list.at(3); 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() < 6) { qCritical() << " m_list failed! " << m_list; return false; } m_IP = m_list.at(1); m_port = m_list.at(2); SA1 = m_list.at(3); DA1 = m_list.at(4); DA2 = m_list.at(5); } else if (commond == "read") { //"read_byte_D3000_300", while (ifRun) { //if (sleepvalue < 2) // Sleep(2); // 读取速度过快,添加10ms延时 //else Sleep(sleepvalue); int length = m_list[3].toInt(); System::String^ address = gcnew System::String(m_list[2].toStdString().c_str()); HslCommunication::OperateResult^>^ result = (*m_pFinsTcpNet)->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! "; } // if (!Failed_data.contains(data)) Failed_data.enqueue(data); //if (m_IsFinsTcp) { //(*m_pFinsTcpNet)->Dispose(); //qDebug() << " (*m_pFinsTcpNet)->Dispose() success!"; if ((*m_pFinsTcpNet)->ConnectClose()->IsSuccess) { qDebug() << " (*m_pFinsTcpNet)->ConnectClose() success!"; } else { qCritical() << " (*m_pFinsTcpNet)->ConnectClose() failed!"; } //m_IsFinsTcp = false; delete* m_pFinsTcpNet; Sleep(50); *m_pFinsTcpNet = gcnew HslCommunication::Profinet::Omron::OmronFinsNet(); (*m_pFinsTcpNet)->IpAddress = gcnew System::String(m_IP.toStdString().c_str()); (*m_pFinsTcpNet)->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 && ifRun) { qDebug() << " TRY xunhuan_num: "<< xunhuan_num; (*m_pFinsTcpNet)->SA1 = (unsigned char)stoi(SA1.toStdString()); (*m_pFinsTcpNet)->DA1 = (unsigned char)stoi(DA1.toStdString());//DA1.toStdString().c_str();//可以测试DA1累加1,不超过255 (*m_pFinsTcpNet)->DA2 = (unsigned char)stoi(DA2.toStdString()); (*m_pFinsTcpNet)->ConnectTimeOut = 1000; // 连接超时2秒 (*m_pFinsTcpNet)->ReceiveTimeOut = 500; // 收发超时0.5秒 if ((*m_pFinsTcpNet)->ConnectServer()->IsSuccess) { m_IsFinsTcp = true; tcp_Status = true; /*QVector Writefailpack; for (QVector::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 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[3].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^ write_list = gcnew cli::array(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_pFinsTcpNet)->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^ write_list = gcnew cli::array(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_pFinsTcpNet)->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^ write_list = gcnew cli::array(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_pFinsTcpNet)->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_pFinsTcpNet)->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; } } else if (commond == "writeHeart") { //例"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^ write_list = gcnew cli::array(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_pFinsTcpNet)->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 { return true; } } tcp_Status = false; return false; } if (m_list[1] == "float") { QString vecValue = m_list.at(3); QStringList valueList = vecValue.split(","); cli::array^ write_list = gcnew cli::array(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_pFinsTcpNet)->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^ write_list = gcnew cli::array(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_pFinsTcpNet)->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_pFinsTcpNet)->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_FinsTcp::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; /*if (sleepvalue <= 5) sleepvalue = 30;*/ QString readname = list.at(2); QString readvalue = list.at(3); QString write_type = list.at(4); QString write_value = list.at(5); } // 连接通讯 *m_pFinsTcpNet = gcnew HslCommunication::Profinet::Omron::OmronFinsNet(); (*m_pFinsTcpNet)->IpAddress = gcnew System::String(m_IP.toStdString().c_str()); (*m_pFinsTcpNet)->Port = stoi(m_port.toStdString()); int xunhuan_num = 20; while (xunhuan_num && ifRun) { (*m_pFinsTcpNet)->SA1 = (unsigned char)stoi(SA1.toStdString()); (*m_pFinsTcpNet)->DA1 = (unsigned char)stoi(DA1.toStdString());//DA1.toStdString().c_str(); (*m_pFinsTcpNet)->DA2 = (unsigned char)stoi(DA2.toStdString()); (*m_pFinsTcpNet)->ConnectTimeOut = 500; // 连接超时0.5秒 (*m_pFinsTcpNet)->ReceiveTimeOut = 500; // 收发超时0.5秒 if ((*m_pFinsTcpNet)->ConnectServer()->IsSuccess) { m_IsFinsTcp = 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_FinsTcp::run() { // 没有用到 //qDebug() << "[info] " << __FUNCTION__ << " line:" << __LINE__ << " success!"; return true; } bool Hd_SocketModule_FinsTcp::decodeWriteResult(QByteArray byte, QVector& 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; } bool Hd_SocketModule_FinsTcp::checkStatus() { return tcp_Status; }