#include "modbustcp.h"
#include <QModbusDevice>
#include "math.h"
ModbusTcp::ModbusTcp(QObject *parent) : QObject(parent)
{
}
void ModbusTcp::writeRegist(quint16 address,quint16 value)
{
QByteArray request;
request.resize(12);
request[0]=0x0;
request[1]=0x3;
request[2]=0x0;
request[3]=0x0;
request[4]=0x0;
request[5]=0x06;
request[6]=0x01;
request[7]=0x06;
uchar addh = address/256;
request[8]=addh;//起始地址h
uchar addl = address%256;
request[9]=addl;//起始地址l
uchar valueh = value/256;
uchar valuel = value%256;
request[10]=valueh;//值1h
request[11]=valuel;//值1l
qDebug()<<"writeRegist:"+QString::number(address)+QString::number(value);
// LogInfo::getInstance()->writeLog("writeRegist:"+QString::number(address)+QString::number(value));
// Console::getInstance()->writeLog("writeRegist:"+QString::number(address)+QString::number(value));
writelst.append(request);
}
void ModbusTcp::writeRegists(quint16 address, QVector<quint16> values)
{
QByteArray request;
request.resize(13+values.count()*2);
request[0]=0x0;
request[1]=0x3;
request[2]=0x0;
request[3]=0x0;
uchar lenh = (7+values.count()*2)/256;
uchar lenl = (7+values.count()*2)%256;
request[4]=lenh;//往后包长度h
request[5]=lenl;//往后包长度l
request[6]=0x01;
request[7]=0x10;
uchar addh = address/256;
request[8]=addh;//起始地址h
uchar addl = address%256;
request[9]=addl;//起始地址l
uchar numh = values.count()/256;
uchar numl = values.count()%256;
request[10]=numh;//数量h
request[11]=numl;//数量l
request[12]=values.count()*2;//字节数
for(int i=0;i<values.count();i++){
uchar valueh = values.at(i)/256;
uchar valuel = values.at(i)%256;
request[13+i*2]=valueh;
request[14+i*2]=valuel;
}
qDebug()<<("writeRegists:"+QString::number(address)+QString::number(values[0])+QString::number(values[1]));
// Console::getInstance()->writeLog("writeRegists:"+QString::number(address)+QString::number(values[0])+QString::number(values[1]));
writelst.append(request);
}
void ModbusTcp::writeCoil(quint16 address, bool value)
{
QByteArray request;
request.resize(12);
request[0]=0x0;
request[1]=0x3;
request[2]=0x0;
request[3]=0x0;
request[4]=0x0;
request[5]=0x06;
request[6]=0x01;
request[7]=0x05;
uchar addh = address/256;
uchar addl = address%256;
request[8]=addh;//起始地址h
request[9]=addl;//起始地址l
if(value)
request[10]=0xff;
else
request[10]=0;
request[11]=0x0;//数量l
qDebug()<<"write coil"+QString::number(address);
// LogInfo::getInstance()->writeLog("write coil"+QString::number(address));
// Console::getInstance()->writeLog("write coil"+QString::number(address));
writelst.append(request);
}
void ModbusTcp::writeCoils(quint16 address, QVector<bool> values)
{
QByteArray request;
request.resize(13+ceil(values.count()/8));
request[0]=0x0;
request[1]=0x0;
request[2]=0x0;
request[3]=0x0;
uchar lenh = (7+ceil(values.count()/8))/256;
uchar lenl = int(7+ceil(values.count()/8))%256;
request[4]=lenh;//往后包长度h
request[5]=lenl;//往后包长度l
request[6]=0x01;
request[7]=0xF;
uchar addh = address/256;
request[8]=addh;//起始地址h
uchar addl = address%256;
request[9]=addl;//起始地址l
uchar numh = values.count()/256;
uchar numl = values.count()%256;
request[10]=numh;//数量h
request[11]=numl;//数量l
request[12]=ceil(values.count()/8);//字节数
QVector<uchar> bs;
uchar a=0;
uchar dy=values.count()%8;
for(uchar i=0;i<dy;i++){
if(values.at(values.count()-1-i))
a+=pow(2,i);
}
bs.append(a);
for(uchar i=0;i<values.count()/8;i++){
a = 0;
for(uchar j=dy+i*8;j<dy+i*8+8;j++){
if(values.at(values.count()-1-j))
a+=pow(2,(j-dy)%8);
}
bs.append(a);
}
for(uchar k=0;k<bs.count();k++){
request[13+k]=bs.at(bs.count()-1-k);
}
client->write(request);
}
void ModbusTcp::initModbus()
{
timer = new QTimer(this);
connect(timer,&QTimer::timeout,this,&ModbusTcp::startThread);
timer->setSingleShot(false);
timer->setInterval(200);
client = new QTcpSocket(this);
connect(client,&QTcpSocket::readyRead,this,&ModbusTcp::parseData);
connect(client,&QTcpSocket::stateChanged,this,&ModbusTcp::stateChanged);
client->connectToHost("192.168.137.5",502);
writeRegist(454,0);
writeRegist(455,0);
writeRegist(457,0);
writeRegist(459,0);
writeRegist(466,0);
}
void ModbusTcp::uninitModbus()
{
if(timer){
timer->stop();
delete timer;
timer = nullptr;
}
client->close();
delete client;
client = nullptr;
}
void ModbusTcp::startThread()
{
timerflag++;
if(!writelst.isEmpty()){
if(writable){
client->write(writelst.first());
writable=false;
}
return;
}
if(timerflag%5==0){
QByteArray request;
request.resize(12);
request[0]=0x0;
request[1]=0x2;
request[2]=0x0;
request[3]=0x0;
request[4]=0x0;
request[5]=0x06;
request[6]=0x01;
request[7]=0x03;
request[8]=0x01;//起始地址h
request[9]=0xc2;//起始地址l
request[10]=0x0;//数量h
request[11]=0x13;//数量l
client->write(request);
return;
}
if(timerflag%8==0){
QByteArray request;
request.resize(12);
request[0]=0x0;
request[1]=0x4;
request[2]=0x0;
request[3]=0x0;
request[4]=0x0;
request[5]=0x06;
request[6]=0x01;
request[7]=0x04;
request[8]=0x0;//起始地址h
request[9]=0x0;//起始地址l
request[10]=0x0;//数量h
request[11]=0x4;//数量l
client->write(request);
return;
}
if(timerflag%12==0){
QByteArray request;
request.resize(12);
request[0]=0x0;
request[1]=0x5;
request[2]=0x0;
request[3]=0x0;
request[4]=0x0;
request[5]=0x06;
request[6]=0x01;
request[7]=0x04;
request[8]=0x0;//起始地址h
request[9]=0x3D;//起始地址l
request[10]=0x0;//数量h
request[11]=0x2;//数量l
client->write(request);
return;
}
if(timerflag%14==0){
QByteArray request;
request.resize(12);
request[0]=0x0;
request[1]=0x1;
request[2]=0x0;
request[3]=0x0;
request[4]=0x0;
request[5]=0x06;
request[6]=0x01;
request[7]=0x04;
request[8]=0x0;//起始地址h
request[9]=0x48;//起始地址l
request[10]=0x0;//数量h
request[11]=0x4;//数量l
client->write(request);
timerflag=0;
}
}
void ModbusTcp::parseData()
{
QByteArray ba = client->readAll();
char flag = ba.at(1);
if(flag==3){
writable=true;
// LogInfo::getInstance()->writeLog("hold write success");
// Console::getInstance()->writeLog("hold write success");
writelst.removeFirst();
return;
}
if(flag==4){
if(ba.size()>9){
ba.remove(0,9);
emit sig_tempData(ba);
}
return;
}
if(flag==5){
if(ba.size()>9){
ba.remove(0,9);
emit sig_nowpos(uchar(ba.at(1)),uchar(ba.at(3)));
}
return;
}
QVector<quint16> data;
i