2024-05-18 23:53:26 +08:00
|
|
|
|
#ifndef Hd_SocketModule_ModbusTcp_H
|
|
|
|
|
|
#define Hd_SocketModule_ModbusTcp_H
|
|
|
|
|
|
|
|
|
|
|
|
#include <QtCore/qglobal.h>
|
|
|
|
|
|
#include <QByteArray>
|
|
|
|
|
|
#include <QThread>
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
#include <QTcpSocket>
|
|
|
|
|
|
#include <QHostAddress>
|
|
|
|
|
|
#include <QMutex>
|
|
|
|
|
|
#include <QObject>
|
|
|
|
|
|
#include <QQueue>
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
#include <Windows.h>
|
|
|
|
|
|
#include <pch.h>
|
|
|
|
|
|
|
|
|
|
|
|
#pragma comment(lib,"./HslComunnicationCpp.lib")
|
|
|
|
|
|
|
|
|
|
|
|
#include "base.h"
|
2024-05-23 15:06:03 +08:00
|
|
|
|
|
2024-05-18 23:53:26 +08:00
|
|
|
|
class writeThread;
|
2024-05-23 15:06:03 +08:00
|
|
|
|
class MyThread : public QThread
|
|
|
|
|
|
{
|
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
public:
|
|
|
|
|
|
MyThread() {};
|
|
|
|
|
|
~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 = false; // 初始化成功 返回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;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2024-05-18 23:53:26 +08:00
|
|
|
|
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<cv::Mat>&,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<cv::Mat>&,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, QVector<QString>vec_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<short> vec_value);
|
|
|
|
|
|
//bool writeResultCommond(QString DM,QString write_Num,QVector<QString> vec_value); // 写入起始位结果值,要做解析再写入
|
|
|
|
|
|
//bool writeStringCommond(QString DM, QString write_num, QString vec_value);
|
|
|
|
|
|
bool decodeWriteResult(QByteArray resultByte,QVector<QString> &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;
|
2024-05-23 15:06:03 +08:00
|
|
|
|
MyThread m_Thread;
|
2024-05-18 23:53:26 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
extern "C"
|
|
|
|
|
|
{
|
|
|
|
|
|
Q_DECL_EXPORT Hd_SocketModule_ModbusTcp * create();
|
|
|
|
|
|
Q_DECL_EXPORT void destory(Hd_SocketModule_ModbusTcp * ptr);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif // Hd_SocketModule_ModbusTcp_H
|