Files
handleaiuinew/BaseModules/Hd_SocketModule_ModbusTcp/Hd_SocketModule_ModbusTcp.h
T

121 lines
5.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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"
class writeThread;
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;
};
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;
MyThread m_Thread;
};
extern "C"
{
Q_DECL_EXPORT Hd_SocketModule_ModbusTcp * create();
Q_DECL_EXPORT void destory(Hd_SocketModule_ModbusTcp * ptr);
}
#endif // Hd_SocketModule_ModbusTcp_H