623 lines
22 KiB
C++
623 lines
22 KiB
C++
#include"Hd_SocketModule_PLC.h"
|
|
#include <QDebug>
|
|
#include <QDateTime>
|
|
#include "pbglobalobject.h"
|
|
|
|
Hd_SocketModule_PLC::Hd_SocketModule_PLC(int type, QObject* parent) :
|
|
QObject(parent), m_plcType(type)
|
|
{
|
|
initUnionGcMembers();
|
|
}
|
|
|
|
void Hd_SocketModule_PLC::initUnionGcMembers()
|
|
{
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::FinsTcp))
|
|
{
|
|
delete (*m_plcImpl.FinsTcp);//托管对象无法判空
|
|
*m_plcImpl.FinsTcp = gcnew HslCommunication::Profinet::Omron::OmronFinsNet();
|
|
|
|
//也可用指针保存,但是使用时要转回原来的类型,略麻烦
|
|
//gcroot<HslCommunication::Profinet::Omron::OmronFinsNet^>* FinsTcp = new gcroot<HslCommunication::Profinet::Omron::OmronFinsNet^>;
|
|
//void* plc = static_cast<void*>(FinsTcp);
|
|
//gcroot<HslCommunication::Profinet::Omron::OmronFinsNet^>* FinsTcp = static_cast<gcroot<HslCommunication::Profinet::Omron::OmronFinsNet^>*>(plc);
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
{
|
|
delete (*m_plcImpl.ModBusTcp);
|
|
*m_plcImpl.ModBusTcp = gcnew HslCommunication::ModBus::ModbusTcpNet();
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McAsciiTcp))
|
|
{
|
|
delete (*m_plcImpl.McAscii);
|
|
*m_plcImpl.McAscii = gcnew HslCommunication::Profinet::Melsec::MelsecMcAsciiNet();
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McA1ETcp))
|
|
{
|
|
delete (*m_plcImpl.McA1E);
|
|
*m_plcImpl.McA1E = gcnew HslCommunication::Profinet::Melsec::MelsecA1ENet();
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McBinaryTcp))
|
|
{
|
|
delete (*m_plcImpl.McBinary);
|
|
*m_plcImpl.McBinary = gcnew HslCommunication::Profinet::Melsec::MelsecMcNet();
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::PanasonicMC))
|
|
{
|
|
delete (*m_plcImpl.PanasonicMc);
|
|
*m_plcImpl.PanasonicMc = gcnew HslCommunication::Profinet::Panasonic::PanasonicMcNet();
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::InovanceH5UTcp))
|
|
{
|
|
delete (*m_plcImpl.InovanceTcp);
|
|
*m_plcImpl.InovanceTcp = gcnew HslCommunication::Profinet::Inovance::InovanceH5UTcp();
|
|
}
|
|
|
|
}
|
|
Hd_SocketModule_PLC::~Hd_SocketModule_PLC()
|
|
{
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::FinsTcp))
|
|
{
|
|
delete (*m_plcImpl.FinsTcp);
|
|
*m_plcImpl.FinsTcp = nullptr;
|
|
|
|
delete m_plcImpl.FinsTcp;
|
|
m_plcImpl.FinsTcp = nullptr;
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
{
|
|
delete (*m_plcImpl.ModBusTcp);
|
|
*m_plcImpl.ModBusTcp = nullptr;
|
|
|
|
delete m_plcImpl.ModBusTcp;
|
|
m_plcImpl.ModBusTcp = nullptr;
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McAsciiTcp))
|
|
{
|
|
delete (*m_plcImpl.McAscii);
|
|
*m_plcImpl.McAscii = nullptr;
|
|
|
|
delete m_plcImpl.McAscii;
|
|
m_plcImpl.McAscii = nullptr;
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McA1ETcp))
|
|
{
|
|
delete (*m_plcImpl.McA1E);
|
|
*m_plcImpl.McA1E = nullptr;
|
|
|
|
delete m_plcImpl.McA1E;
|
|
m_plcImpl.McA1E = nullptr;
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McBinaryTcp))
|
|
{
|
|
delete (*m_plcImpl.McBinary);
|
|
*m_plcImpl.McBinary = nullptr;
|
|
|
|
delete m_plcImpl.McBinary;
|
|
m_plcImpl.McBinary = nullptr;
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::PanasonicMC))
|
|
{
|
|
delete (*m_plcImpl.PanasonicMc);
|
|
*m_plcImpl.PanasonicMc = nullptr;
|
|
|
|
delete m_plcImpl.PanasonicMc;
|
|
m_plcImpl.PanasonicMc = nullptr;
|
|
}
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::InovanceH5UTcp))
|
|
{
|
|
delete (*m_plcImpl.InovanceTcp);
|
|
*m_plcImpl.InovanceTcp = nullptr;
|
|
|
|
delete m_plcImpl.InovanceTcp;
|
|
m_plcImpl.InovanceTcp = nullptr;
|
|
}
|
|
qDebug() << " ~Hd_SocketModule_PLC success!";
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::setParameter(const QMap<QString, QString>& param)
|
|
{
|
|
m_params = param;
|
|
return true;
|
|
}
|
|
|
|
QMap<QString, QString> Hd_SocketModule_PLC::parameters()
|
|
{
|
|
return m_params;
|
|
}
|
|
|
|
//加载模块dll导出函数,构造类
|
|
bool Hd_SocketModule_PLC::init()
|
|
{
|
|
System::String^ Code = gcnew System::String("b5f8f9f7-c075-4913-ae6e-d7d2cc6f2de1");
|
|
if (HslCommunication::Authorization::SetAuthorizationCode(Code))
|
|
qDebug() << "Register HSLCode Success" << endl;
|
|
else
|
|
qDebug() << "Register HSLCode Fail" << endl;
|
|
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::FinsTcp))
|
|
return initFinsTcp();
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
return initModbusTcp();
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McAsciiTcp))
|
|
return initMcAscii();
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McA1ETcp))
|
|
return initMcA1E();
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McBinaryTcp))
|
|
return initMcBinary();
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::PanasonicMC))
|
|
return initPanasonicMc();
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::InovanceH5UTcp))
|
|
return initInovanceTcp();
|
|
return true;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::setData(const QByteArray& data)
|
|
{
|
|
if (data.isEmpty())
|
|
{
|
|
qCritical() << " data is null";
|
|
return false;
|
|
}
|
|
|
|
QMutexLocker locker(m_writeMutex);
|
|
Sleep(m_sleepTime);
|
|
|
|
QList<QByteArray> byteList = data.split('_');
|
|
if (byteList.size() != 4)
|
|
{
|
|
qCritical() << data + " size() != 4, command error." << endl;
|
|
return false;
|
|
}
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
byteList[2] = byteList[2].mid(1, byteList[2].length() - 1);
|
|
if (byteList[0] == "read")//"read_byte_D3000_300"
|
|
{
|
|
auto readFunc = [=]() {
|
|
System::String^ address = gcnew System::String(byteList[2].toStdString().c_str());
|
|
HslCommunication::OperateResult<cli::array<unsigned char>^>^ result;
|
|
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::FinsTcp))
|
|
result = (*m_plcImpl.FinsTcp)->Read(address, byteList[3].toInt());
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
result = (*m_plcImpl.ModBusTcp)->Read(address, byteList[3].toInt());
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McAsciiTcp))
|
|
result = (*m_plcImpl.McAscii)->Read(address, byteList[3].toInt());
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McA1ETcp))
|
|
result = (*m_plcImpl.McA1E)->Read(address, byteList[3].toInt());
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McBinaryTcp))
|
|
result = (*m_plcImpl.McBinary)->Read(address, byteList[3].toInt());
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::PanasonicMC))
|
|
result = (*m_plcImpl.PanasonicMc)->Read(address, byteList[3].toInt());
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::InovanceH5UTcp))
|
|
result = (*m_plcImpl.InovanceTcp)->Read(address, byteList[3].toInt());
|
|
return result;
|
|
};
|
|
|
|
auto readSucFunc = [&](HslCommunication::OperateResult<cli::array<unsigned char>^>^& result) {
|
|
QByteArray byte;
|
|
for (int i = 0; i < byteList[3].toInt() * 2; i++)
|
|
byte.append(result->Content[i]);
|
|
|
|
//qDebug() << "read bytes:" << byte;
|
|
m_readData.append(byte);
|
|
};
|
|
|
|
auto result = readFunc();
|
|
if (result->IsSuccess)
|
|
{
|
|
readSucFunc(result);
|
|
return true;
|
|
}
|
|
qDebug() << data + "read failed" << endl;
|
|
int retryCount = 3;
|
|
while (retryCount-- > 0)
|
|
{
|
|
closeSocket();
|
|
initUnionGcMembers();
|
|
if (!init())//成功
|
|
{
|
|
Sleep(m_sleepTime);
|
|
continue;
|
|
}
|
|
auto res = readFunc();
|
|
if (!res->IsSuccess)
|
|
{
|
|
Sleep(m_sleepTime);
|
|
continue;
|
|
}
|
|
|
|
readSucFunc(res);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
else if (byteList[0] == "write")//例"write_short_D1003_1", "write_short_D1003_1,1,1,1"
|
|
{
|
|
if (byteList[1] != "short" && byteList[1] != "float" &&
|
|
byteList[1] != "double" && byteList[1] != "string")
|
|
return false;
|
|
|
|
QList<QByteArray> valueList = byteList[3].split(',');
|
|
for (auto val = 0; val < 5; val++)
|
|
{
|
|
bool res = false;
|
|
if (byteList[1] == "short")
|
|
res = writeShortData(byteList[2], valueList);
|
|
else if (byteList[1] == "float")
|
|
res = writeFloatData(byteList[2], valueList);
|
|
else if (byteList[1] == "double")
|
|
res = writeDoubleData(byteList[2], valueList);
|
|
else
|
|
res = writeStringData(byteList[2], byteList[3]);
|
|
if (res)
|
|
break;
|
|
|
|
qCritical() << "val: " << val << " write failed! byteList: " << byteList;
|
|
m_failedData.enqueue(data);
|
|
Sleep(m_sleepTime);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::data(QByteArray& data)
|
|
{
|
|
QMutexLocker locker(m_readMutex);
|
|
if (m_readData.isEmpty())
|
|
data = {};
|
|
else
|
|
data.append(m_readData.dequeue());
|
|
return true;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::initFinsTcp()
|
|
{
|
|
//"init_ip_port_sA1_dA1_dA2"
|
|
QStringList init = m_params["init"].split("_");
|
|
m_sleepTime = m_params["initParams"].split("_")[1].toUInt();
|
|
if (init[0] != "init" && init.size() != 6)
|
|
{
|
|
qDebug() << "init FinsTcp param error" << endl;
|
|
return false;
|
|
}
|
|
(*m_plcImpl.FinsTcp)->IpAddress = gcnew System::String(init[1].toStdString().c_str());
|
|
(*m_plcImpl.FinsTcp)->Port = init[2].toUInt();
|
|
(*m_plcImpl.FinsTcp)->DA1 = (unsigned char)(init[4].toUInt());
|
|
(*m_plcImpl.FinsTcp)->DA2 = (unsigned char)(init[5].toUInt());
|
|
(*m_plcImpl.FinsTcp)->ConnectTimeOut = 500;//连接超时0.5秒
|
|
(*m_plcImpl.FinsTcp)->ReceiveTimeOut = 500;//收发超时0.5秒
|
|
int sa1 = (unsigned char)(init[3].toUInt());
|
|
int loopCount = 20;
|
|
while (loopCount > 0)
|
|
{
|
|
(*m_plcImpl.FinsTcp)->SA1 = (unsigned char)sa1;
|
|
if ((*m_plcImpl.FinsTcp)->ConnectServer()->IsSuccess)
|
|
{
|
|
qDebug() << "FinsTcp Connect Success! SA1: " << sa1 << endl;
|
|
return true;
|
|
}
|
|
|
|
--loopCount;
|
|
++sa1;
|
|
qCritical() << "FinsTcp Connect failed! SA1: " << sa1 << endl;
|
|
Sleep(m_sleepTime);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::initModbusTcp()
|
|
{
|
|
//"init_ip_port_station"
|
|
QStringList init = m_params["init"].split("_");
|
|
m_sleepTime = m_params["initParams"].split("_")[1].toUInt();
|
|
if (init[0] != "init" && init.size() != 4)
|
|
{
|
|
qDebug() << "init Modbus param error" << endl;
|
|
return false;
|
|
}
|
|
|
|
(*m_plcImpl.ModBusTcp)->IpAddress = gcnew System::String(init[1].toStdString().c_str());
|
|
(*m_plcImpl.ModBusTcp)->Port = init[2].toUInt();
|
|
(*m_plcImpl.ModBusTcp)->Station = (unsigned char)init[3].toUInt();
|
|
//(*m_plcImpl.ModBusTcp)->ConnectTimeOut = 500;//连接超时0.5秒
|
|
//(*m_plcImpl.ModBusTcp)->ReceiveTimeOut = 500;//收发超时0.5秒
|
|
|
|
int loopCount = 20;
|
|
while (loopCount > 0)
|
|
{
|
|
if ((*m_plcImpl.ModBusTcp)->ConnectServer()->IsSuccess)
|
|
{
|
|
qDebug() << "ModBusTcp Connect Success!" << endl;
|
|
return true;
|
|
}
|
|
|
|
qCritical() << "ModBusTcp Connect failed!" << endl;
|
|
--loopCount;
|
|
Sleep(m_sleepTime);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::initMcAscii()
|
|
{
|
|
//"init_ip_port"
|
|
QStringList init = m_params["init"].split("_");
|
|
m_sleepTime = m_params["initParams"].split("_")[1].toUInt();
|
|
if (init[0] != "init" && init.size() != 3)
|
|
{
|
|
qDebug() << "init McAscii param error" << endl;
|
|
return false;
|
|
}
|
|
(*m_plcImpl.McAscii)->IpAddress = gcnew System::String(init[1].toStdString().c_str());
|
|
(*m_plcImpl.McAscii)->Port = init[2].toUInt();
|
|
(*m_plcImpl.McAscii)->ConnectTimeOut = 500;//连接超时0.5秒
|
|
(*m_plcImpl.McAscii)->ReceiveTimeOut = 500;//收发超时0.5秒
|
|
int loopCount = 20;
|
|
while (loopCount > 0)
|
|
{
|
|
if ((*m_plcImpl.McAscii)->ConnectServer()->IsSuccess)
|
|
{
|
|
qDebug() << "McAscii Connect Success!" << endl;
|
|
return true;
|
|
}
|
|
|
|
qCritical() << "McAscii Connect failed!" << endl;
|
|
--loopCount;
|
|
Sleep(m_sleepTime);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::initMcA1E()
|
|
{
|
|
//"init_ip_port"
|
|
QStringList init = m_params["init"].split("_");
|
|
m_sleepTime = m_params["initParams"].split("_")[1].toUInt();
|
|
if (init[0] != "init" && init.size() != 3)
|
|
{
|
|
qDebug() << "init McA1E param error" << endl;
|
|
return false;
|
|
}
|
|
|
|
(*m_plcImpl.McA1E)->IpAddress = gcnew System::String(init[1].toStdString().c_str());
|
|
(*m_plcImpl.McA1E)->Port = init[2].toUInt();
|
|
(*m_plcImpl.McA1E)->ConnectTimeOut = 500;//连接超时0.5秒
|
|
(*m_plcImpl.McA1E)->ReceiveTimeOut = 500;//收发超时0.5秒
|
|
int loopCount = 20;
|
|
while (loopCount > 0)
|
|
{
|
|
if ((*m_plcImpl.McA1E)->ConnectServer()->IsSuccess)
|
|
{
|
|
qDebug() << "McA1E Connect Success!" << endl;
|
|
return true;
|
|
}
|
|
|
|
qCritical() << "McA1E Connect failed!" << endl;
|
|
--loopCount;
|
|
Sleep(m_sleepTime);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::initMcBinary()
|
|
{
|
|
//"init_ip_port"
|
|
QStringList init = m_params["init"].split("_");
|
|
m_sleepTime = m_params["initParams"].split("_")[1].toUInt();
|
|
if (init[0] != "init" && init.size() != 3)
|
|
{
|
|
qDebug() << "init McBinary param error" << endl;
|
|
return false;
|
|
}
|
|
|
|
(*m_plcImpl.McBinary)->IpAddress = gcnew System::String(init[1].toStdString().c_str());
|
|
(*m_plcImpl.McBinary)->Port = init[2].toUInt();
|
|
(*m_plcImpl.McBinary)->ConnectTimeOut = 500;//连接超时0.5秒
|
|
(*m_plcImpl.McBinary)->ReceiveTimeOut = 500;//收发超时0.5秒
|
|
int loopCount = 20;
|
|
while (loopCount > 0)
|
|
{
|
|
if ((*m_plcImpl.McBinary)->ConnectServer()->IsSuccess)
|
|
{
|
|
qDebug() << "McBinary Connect Success!" << endl;
|
|
return true;
|
|
}
|
|
|
|
qCritical() << "McBinary Connect failed!" << endl;
|
|
--loopCount;
|
|
Sleep(m_sleepTime);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::initPanasonicMc()
|
|
{
|
|
//"init_ip_port"
|
|
QStringList init = m_params["init"].split("_");
|
|
m_sleepTime = m_params["initParams"].split("_")[1].toUInt();
|
|
if (init[0] != "init" && init.size() != 3)
|
|
{
|
|
qDebug() << "init PanasonicMc param error" << endl;
|
|
return false;
|
|
}
|
|
|
|
(*m_plcImpl.PanasonicMc)->IpAddress = gcnew System::String(init[1].toStdString().c_str());
|
|
(*m_plcImpl.PanasonicMc)->Port = init[2].toUInt();
|
|
(*m_plcImpl.PanasonicMc)->ConnectTimeOut = 500;//连接超时0.5秒
|
|
(*m_plcImpl.PanasonicMc)->ReceiveTimeOut = 500;//收发超时0.5秒
|
|
int loopCount = 20;
|
|
while (loopCount > 0)
|
|
{
|
|
if ((*m_plcImpl.PanasonicMc)->ConnectServer()->IsSuccess)
|
|
{
|
|
qDebug() << "PanasonicMc Connect Success!" << endl;
|
|
return true;
|
|
}
|
|
|
|
qCritical() << "PanasonicMc Connect failed!" << endl;
|
|
--loopCount;
|
|
Sleep(m_sleepTime);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::initInovanceTcp()
|
|
{
|
|
//"init_ip_port"
|
|
QStringList init = m_params["init"].split("_");
|
|
m_sleepTime = m_params["initParams"].split("_")[1].toUInt();
|
|
if (init[0] != "init" && init.size() != 3)
|
|
{
|
|
qDebug() << "init InovanceTcp param error" << endl;
|
|
return false;
|
|
}
|
|
|
|
(*m_plcImpl.InovanceTcp)->IpAddress = gcnew System::String(init[1].toStdString().c_str());
|
|
(*m_plcImpl.InovanceTcp)->Port = init[2].toUInt();
|
|
(*m_plcImpl.InovanceTcp)->ConnectTimeOut = 500;//连接超时0.5秒
|
|
(*m_plcImpl.InovanceTcp)->ReceiveTimeOut = 500;//收发超时0.5秒
|
|
int loopCount = 20;
|
|
while (loopCount > 0)
|
|
{
|
|
if ((*m_plcImpl.InovanceTcp)->ConnectServer()->IsSuccess)
|
|
{
|
|
qDebug() << "InovanceTcp Connect Success!" << endl;
|
|
return true;
|
|
}
|
|
|
|
qCritical() << "InovanceTcp Connect failed!" << endl;
|
|
--loopCount;
|
|
Sleep(m_sleepTime);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::closeSocket()
|
|
{
|
|
bool res = false;
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::FinsTcp))
|
|
res = (*m_plcImpl.FinsTcp)->ConnectClose()->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
res = (*m_plcImpl.ModBusTcp)->ConnectClose()->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McAsciiTcp))
|
|
res = (*m_plcImpl.McAscii)->ConnectClose()->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McA1ETcp))
|
|
res = (*m_plcImpl.McA1E)->ConnectClose()->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McBinaryTcp))
|
|
res = (*m_plcImpl.McBinary)->ConnectClose()->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::PanasonicMC))
|
|
res = (*m_plcImpl.PanasonicMc)->ConnectClose()->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::InovanceH5UTcp))
|
|
res = (*m_plcImpl.InovanceTcp)->ConnectClose()->IsSuccess;
|
|
|
|
if (!res)
|
|
qCritical() << "ConnectClose() failed!";
|
|
return res;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::writeShortData(const QByteArray& addr, const QList<QByteArray>& data)
|
|
{
|
|
cli::array<short>^ writeList = gcnew cli::array<short>(data.length());
|
|
for (int i = 0; i < data.length(); i++)
|
|
writeList[i] = data[i].toShort();
|
|
|
|
System::String^ address = gcnew System::String(addr.toStdString().c_str());
|
|
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::FinsTcp))
|
|
return (*m_plcImpl.FinsTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
return (*m_plcImpl.ModBusTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McAsciiTcp))
|
|
return (*m_plcImpl.McAscii)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McA1ETcp))
|
|
return (*m_plcImpl.McA1E)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McBinaryTcp))
|
|
return (*m_plcImpl.McBinary)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::PanasonicMC))
|
|
return (*m_plcImpl.PanasonicMc)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::InovanceH5UTcp))
|
|
return (*m_plcImpl.InovanceTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::writeFloatData(const QByteArray& addr, const QList<QByteArray>& data)
|
|
{
|
|
cli::array<float>^ writeList = gcnew cli::array<float>(data.length());
|
|
for (int i = 0; i < data.length(); i++)
|
|
writeList[i] = data[i].toFloat();
|
|
|
|
System::String^ address = gcnew System::String(addr.toStdString().c_str());
|
|
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::FinsTcp))
|
|
return (*m_plcImpl.FinsTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
return (*m_plcImpl.ModBusTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McAsciiTcp))
|
|
return (*m_plcImpl.McAscii)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McA1ETcp))
|
|
return (*m_plcImpl.McA1E)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McBinaryTcp))
|
|
return (*m_plcImpl.McBinary)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::PanasonicMC))
|
|
return (*m_plcImpl.PanasonicMc)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::InovanceH5UTcp))
|
|
return (*m_plcImpl.InovanceTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::writeDoubleData(const QByteArray& addr, const QList<QByteArray>& data)
|
|
{
|
|
cli::array<double>^ writeList = gcnew cli::array<double>(data.length());
|
|
for (int i = 0; i < data.length(); i++)
|
|
writeList[i] = data[i].toDouble();
|
|
|
|
System::String^ address = gcnew System::String(addr.toStdString().c_str());
|
|
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::FinsTcp))
|
|
return (*m_plcImpl.FinsTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
return (*m_plcImpl.ModBusTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McAsciiTcp))
|
|
return (*m_plcImpl.McAscii)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McA1ETcp))
|
|
return (*m_plcImpl.McA1E)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McBinaryTcp))
|
|
return (*m_plcImpl.McBinary)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::PanasonicMC))
|
|
return (*m_plcImpl.PanasonicMc)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::InovanceH5UTcp))
|
|
return (*m_plcImpl.InovanceTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeList)->IsSuccess;
|
|
|
|
return false;
|
|
}
|
|
|
|
bool Hd_SocketModule_PLC::writeStringData(const QByteArray& addr, const QByteArray& data)
|
|
{
|
|
System::String^ address = gcnew System::String(addr.toStdString().c_str());
|
|
System::String^ writeValue = gcnew System::String(data.toStdString().c_str());
|
|
|
|
if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::FinsTcp))
|
|
return (*m_plcImpl.FinsTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeValue)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::ModbusTcp))
|
|
return (*m_plcImpl.ModBusTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeValue)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McAsciiTcp))
|
|
return (*m_plcImpl.McAscii)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeValue)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McA1ETcp))
|
|
return (*m_plcImpl.McA1E)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeValue)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::McBinaryTcp))
|
|
return (*m_plcImpl.McBinary)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeValue)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::PanasonicMC))
|
|
return (*m_plcImpl.PanasonicMc)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeValue)->IsSuccess;
|
|
else if (m_plcType == static_cast<int>(PLC_MODULE_TYPE::InovanceH5UTcp))
|
|
return (*m_plcImpl.InovanceTcp)->HslCommunication::Core::Net::NetworkDeviceBase::Write(address, writeValue)->IsSuccess;
|
|
|
|
return false;
|
|
}
|