#ifndef Hd_SocketModule_ModbusTcp_H #define Hd_SocketModule_ModbusTcp_H #include #include #include #include #include #include #include #include #include #include #include #include #pragma comment(lib,"./HslComunnicationCpp.lib") #include "base.h" class MyThread; class writeThread; class Hd_SocketModule_ModbusTcp :public Base { Q_OBJECT public: //创建,这里new一下锁 Hd_SocketModule_ModbusTcp(); //释放,删除连接,释放锁 virtual ~Hd_SocketModule_ModbusTcp(); //向主线程发送数据,通信Mat为空 //主线程调用sendData函数,把读报文的数据段发送回来。 //注意,只要数据段。 //主线程根据通信流程解析数据段。 //先reciveData,再sendData; bool readData(std::vector&,QByteArray&);//readData将PLC读取或者发送的返回值发回给主线程,通过全局变量的方式逐条发送 //接收主线程发来的数据,通信Mat为空 //例:write_DM1300_9,写寄存器DM1300为9; //例:writeAll_DM1700_14_1,1,1,1,1,1,1,1,1,1,1,1,1,1,写寄存器DM1700-DM1713的14个寄存器,均为1 //例:readAll_DM1400_100,读DM1400-DM1499的100个寄存器; //例:readAll_DM1001_1,读DM1001 //例:writeString_DM1340_12_2023-0217-1650-03-0899,写寄存器DM1340-DM1351时间戳,一个寄存器里面含2个字符; //其它通信方式可参考,并添加解析协议。如:writeFloat_DM10000_-1.1,指令函数增加bool writeFloat(QString DM,QString value); bool writeData(std::vector&,QByteArray&); //writeData调用PLC的收发,将需要的数据发给寄存器,返回OK/NG //把通信创建需要的参数传进去,不同协议不同,例:init_192.168.1.50_9600_24; //连接通信,可以在run函数里进行 bool initParas(QByteArray&); //运行 bool run(); //检查异常标志 bool checkStatus(); private: QString UShortToHex(int value); // 只转 ushort 类型 QString ShortToHex(int value); // 只转 short 类型 void setSleepTimeAndReadNum(int time,int num); bool writeCommond(QString DM, QString type, QVectorvec_value); // 写入单个值; //例:write_DM1300_9 bool readCommond(QString DM, QString type, QString Num); //bool writeCommond(QString DM,QString m_value); // 写入单个值; //例:write_DM1300_9 //bool readCommond(QString DM,QString Num); //bool readAllCommond(QString DM,QString Num); // 写入连续的值 //bool writeAllCommond(QString DM,QString write_Num,QVector vec_value); //bool writeResultCommond(QString DM,QString write_Num,QVector vec_value); // 写入起始位结果值,要做解析再写入 //bool writeStringCommond(QString DM, QString write_num, QString vec_value); bool decodeWriteResult(QByteArray resultByte,QVector &vec_ret); bool tcpServer(QByteArray cmd, QByteArray& resultPack); void decodePack(QByteArray resultArray); private: int m_sleepTime = 100; // 延迟时间 int m_readPackNum = 50; // 接受50个数据包的长度 为 122 ,加包头一起为 130 QString m_host; QString m_IP; QString m_pos; // 位置 100 110 QString hex_ip_lastpos; // 获取ip 最后一位 QString m_writeType = "ushort"; // 初始化时候 设置 传输的类型是 sort 还是int 类型,还是ushort 类型, 默认ushort 类型 QString m_posName; QString m_Station; //MyThread *m_Thread = nullptr; //QTcpSocket* tcpsocket = nullptr; //tcp通信的socket QMutex* m_Mutex = nullptr; MyThread* m_Thread = nullptr; }; //自己创建线程 class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr):QThread(parent){} ~MyThread(); bool setIpAndPort(QString ip,QString port); void run(); void readSocketData(); //读取数据 void writeSocketData(); //写入数据 void decodePack(); void setMutexLock(QMutex* lock) { m_mutex_lock = lock; } void setRunStop(){ init_flag = 2;} void setReadPackValue(int value); void closeSocket(); bool getInitSuccessFlag(){return init_success;} bool disReconnects(); void setSocketIp(QString Station) { m_Station = Station; } private: QString m_IP; QString m_Port; QString m_Station; QMutex m_Mutex; QByteArray reciveData; QString socketIp; bool init_success = true; // 初始化成功 返回true;失败返回false int init_flag = 0; // false为完整数据包,true为非完整数据包 int m_readPackValue = 122; // 接受50个数据包的长度 为 122 ,加包头一起为 130, 如果是 100的话就是 222 加包头为230 QMutex* m_mutex_lock = nullptr; //QTcpSocket *tcpsocket = nullptr; // tcp通信的socket HDTcpBase* tcpsocket = nullptr; }; extern "C" { Q_DECL_EXPORT Hd_SocketModule_ModbusTcp * create(); Q_DECL_EXPORT void destory(Hd_SocketModule_ModbusTcp * ptr); } #endif // Hd_SocketModule_ModbusTcp_H