#include "modbusoverudp.h" ModbusOverUdp::ModbusOverUdp(QObject *parent) : QObject(parent) {timer= new QTimer(); timer->setInterval(300); connect(timer,SIGNAL(timeout()),this,SLOT(timeout())); timer->start(); } void ModbusOverUdp::timeout() {static int count; if(!isConnected) count=0; if(isConnected){//запросы по всем фронтам /* for(quint16 i=1; i<=4; i++){ req(i,SENS); req(i,STATE); } */ if(count<4)count++; else count=1; req(count,SENS); req(count,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 - начало контрольной сумимы { if(iobuf.size()>len +2){qDebug()<<"немного великоват"; return 0;} if(iobuf.size()==0){qDebug()<<"нулевой размер массива";} if(len==0){qDebug()<<"нулевая длинна";} uint16_t crc = 0xFFFF; try{ for(uint16_t i = 0; i < len; i++) { if(iobuf.size()> 8) ^ Crc16Table[(crc & 0xFF) ^ (iobuf.at(i) & 0xFF)]; // ввел маску 0xFF, тк прилетает 0хFFFFFFxx } } catch(const char* error_message){ qDebug()<hasPendingDatagrams()) { QNetworkDatagram datagram = udpSocket->receiveDatagram(); QByteArray recived = datagram.data(); // копируем датаграмку в аррэй для удобной работы qDebug()<<"прибыл размером"<2) return; if((int)recived[6]>5) return; if((int)recived[8]>7) return; if((int)recived[10]>12) return; if((int)recived[22]>7) return; 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.VALUE=(typeVALUE)(recived[22]-0); emit stateRecive(toSend); break; default: qDebug()<bind(QHostAddress::LocalHost,8000,QAbstractSocket::DontShareAddress); targetIp =QHostAddress(oldIp); targetPort=7000; // QUdpSocket *udpSocketForRecive= new QUdpSocket(this); connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams())); QStringList ip= newIp.split("."); qDebug()<writeDatagram(datagram); udpSocket->waitForBytesWritten(50); } 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"<writeDatagram(datagram); }