A142_Desktop/modbusoverudp.cpp

197 lines
4.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "modbusoverudp.h"
ModbusOverUdp::ModbusOverUdp(QObject *parent) : QObject(parent)
{timer= new QTimer();
timer->setInterval(1000);
connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
timer->start();
}
void ModbusOverUdp::timeout()
{
if(isConnected){//запросы по всем фронтам
for(quint16 i=1; i<=4; i++){
req(i,SENS);
req(i,STATE);
}
}
}
uint16_t ModbusOverUdp::Crc16(uint16_t len, uint16_t iobuf[]) //CRC для сообщения такой то длинны /Len - начало контрольной сумимы
{
uint16_t i;
uint16_t crc = 0xFFFF;
for(i = 0; i < len; i++) {
crc = (crc >> 8) ^ Crc16Table[(crc & 0xFF) ^ (iobuf[i]& 0xFF)];
}
return crc;
}
uint16_t ModbusOverUdp::Crc16(uint16_t len, QByteArray iobuf) //CRC для сообщения такой то длинны /Len - начало контрольной сумимы
{
uint16_t i;
uint16_t crc = 0xFFFF;
for(i = 0; i < len; i++) {
crc = (crc >> 8) ^ Crc16Table[(crc & 0xFF) ^ (iobuf[i] & 0xFF)]; // ввел маску 0xFF, тк прилетает 0хFFFFFFxx
}
return crc;
}
void ModbusOverUdp::readPendingDatagrams()
{
while (udpSocket->hasPendingDatagrams()) {
QNetworkDatagram datagram = udpSocket->receiveDatagram();
processTheDatagram(datagram);
}
}
void ModbusOverUdp::processTheDatagram(QNetworkDatagram & datagram)
{
QByteArray recived = datagram.data(); // копируем датаграмку в аррэй для удобной работы
Set toSend; //структура для отправки в другой компонент
sfloat res; //флоат для сборки из пакета модбас
toSend.channel=(typeCHANNEL)(recived[0]-1); //Ch1 = 0 - в енаме
switch (recived.size()){ // сужу о прибывшем по размеру пакета // ЭТО ПЛОХО!!!
case 9:
res.ch[3]=recived[3]; // Собираю флоат
res.ch[2]=recived[4];
res.ch[1]=recived[5];
res.ch[0]=recived[6];
//qDebug() <<"Чувствительность для модбас адреса"<<toSend.channel+1 <<res.fl;
toSend.SENS= res.fl;
emit sensRecive(toSend);
break;
case 25:
//qDebug() <<"Подвалило состояние для модбас адреса"<<toSend.channel+1;
toSend.IIN=(typeIIN)(recived[4]-0);
toSend.IFV=(typeIFV)(recived[6]-0);
toSend.IFN=(typeIFN)(recived[8]-0);
toSend.IKU=(typeIKU)(recived[10]-0);
//toSend.OUTPUT=(typeOUTPUT)(recived[2]-0);
toSend.VALUE=(typeVALUE)(recived[22]-0);
emit stateRecive(toSend);
break;
default:
qDebug() <<"ТЫ не понимаешь, это другое";
qDebug() <<"Это"<<recived<<"размером"<<recived.size();
break;
//Разберись с этим
// "\x01\x10\x13\x89\x00\n\x14\x00\x00\x00\x04\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x05\xB3" размером 29
}
}
void ModbusOverUdp::connectTo(QString ipAdress, quint16 port)
{
udpSocket = new QUdpSocket(this);
targetIp =QHostAddress(ipAdress);
targetPort=port;
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
isConnected=1;
}
void ModbusOverUdp::disconnectFrom()
{
isConnected=0;
}
void ModbusOverUdp::req(quint16 adr, typeREQ TYPEREQ)
{
QByteArray data;
switch (TYPEREQ)
{
case SENS:{
data.resize(8);
data[0]=adr;
data[1]=0x3;
data[2]=0x1b;
data[3]=0x5c;
data[4]=0x00;
data[5]=0x2;
uint16_t crcToSend= Crc16((uint16_t)6, data);
data[6]=LO(crcToSend);
data[7]=HI(crcToSend);
break;
}
case STATE:{
data.resize(8);
data[0]=adr;
data[1]=0x3;
data[2]=0x13;
data[3]=0x89;
data[4]=0x00;
data[5]=0xa;
uint16_t crcToSend= Crc16((uint16_t)6, data);
data[6]=LO(crcToSend);
data[7]=HI(crcToSend);
break;
}
}
sendPendingDatagrams(data);
}
void ModbusOverUdp::testReq()
{
QByteArray data;
data.resize(8);
data[0]=0x1;
data[1]=0x3;
data[2]=0x13;
data[3]=0x89;
data[4]=0x00;
data[5]=0x4;
uint16_t crcToSend= Crc16((uint16_t)6, data);
data[6]=LO(crcToSend);
data[7]=HI(crcToSend);
sendPendingDatagrams(data);
}
void ModbusOverUdp::sendPendingDatagrams( QByteArray & data )
{
QNetworkDatagram datagram;
datagram.setDestination(targetIp,targetPort);
datagram.setData(data);
// qDebug()<<"sended"<<datagram.data();
udpSocket->writeDatagram(datagram);
}
void ModbusOverUdp::stateSend(Set setWithState)
{
}
void ModbusOverUdp::sensSend(Set setWithSens)
{
}