1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 上位机与PLC基于Fins/UDP通信

上位机与PLC基于Fins/UDP通信

时间:2020-12-17 00:09:52

相关推荐

上位机与PLC基于Fins/UDP通信

QT上位机与PLC通信

Fins/UDP通信写格式写反馈读格式读反馈进制间转换函数int-to-16进制字符串-to-16进制16进制-to-字符串Fins/UDP通信读写函数读写反馈

Fins/UDP通信

编写上位机通过发送Fins/UDP命令读写plc内部数据,可以用于上位机socket通讯测试,员工操作监控,运行日志打印。Fins/UDP是以十六进制字符发送命令,所以所有字符在发送前都需要将其转换成十六进制。

写格式

固定头:800002不变plc节点:006E00地址:XXX.XXX.XXX.110PC节点:00F400地址:XXX.XXX.XXX.244结束:00不变写代码:0102不变D区代码:82不变D区地址:01A600根据需求修改,十六进制数据写入长度:0001根据需求修改,十六进制数据写入数据:0212

写反馈

固定头:C00002不变PC节点:00F400地址:XXX.XXX.XXX.244plc节点:006E00地址:XXX.XXX.XXX.110结束:00不变写代码:0102不变写入成功:0000

读格式

固定头:800002不变plc节点:006E00地址:XXX.XXX.XXX.110PC节点:00F400地址:XXX.XXX.XXX.244结束:00不变读代码:0101不变D区代码:82不变D区地址:01A600根据需求修改,十六进制数据读取长度:0002根据需求修改,十六进制数据

读反馈

固定头:C00002不变PC节点:00F400地址:XXX.XXX.XXX.244plc节点:006E00地址:XXX.XXX.XXX.110结束:00不变读代码:0101不变plc状态:0000自动变换plc反馈的数据:66664006

进制间转换函数

int型与字符串转16进制,16进制转字符串。

int-to-16进制

int num=666;QString Dnum = QString::number(num,16);

字符串-to-16进制

QByteArray ReadPLC::QString2Hex(QString str){QByteArray senddata;int hexdata,lowhexdata;int hexdatalen = 0;int len = str.length();senddata.resize(len/2);char lstr,hstr;for(int i=0; i<len; ){hstr=str[i].toLatin1();if(hstr == ' '){i++;continue;}i++;if(i >= len)break;lstr = str[i].toLatin1();hexdata = ConvertHexChar(hstr);lowhexdata = ConvertHexChar(lstr);if((hexdata == 16) || (lowhexdata == 16))break;elsehexdata = hexdata*16+lowhexdata;i++;senddata[hexdatalen] = (char)hexdata;hexdatalen++;}senddata.resize(hexdatalen);return senddata;}char ReadPLC::ConvertHexChar(char ch){if((ch >= '0') && (ch <= '9'))return ch-0x30;else if((ch >= 'A') && (ch <= 'F'))return ch-'A'+10;else if((ch >= 'a') && (ch <= 'f'))return ch-'a'+10;else return (-1);}

16进制-to-字符串

自行补充

Fins/UDP通信

读函数与写函数都差不多,读写反馈可以使用信号槽来监听新数据,也可以直接后面写函数来读取,只不过需要做一下延时处理。

读写函数

/*函数功能:读取PLC数据函数参数说明:*bindPort:plc端口*bindIP:plcIP*winIP:PCIP*IO:读取位数*WID:读取地址*/void ReadPLC::readplcdata(QString bindPort,QString bindIP, QString winIP, int IO, int WID){QString plcip,winddowip;int plcIPEnd = bindIP.split(".").at(3).toInt();plcip = QString::number(plcIPEnd,16).toUpper(); int winIPEnd = winIP.split(".").at(3).toInt();winddowip = QString::number(winIPEnd,16).toUpper(); //得到win的十六进制if(plcip.size()==1){plcip = "0"+plcip;}if(winddowip.size()==1){winddowip = "0"+winddowip;}QString ID = intTo16(WID); QString writeIO = "000"+QString::number(IO,16).toUpper();QString plcwrite = "80000200"+plcip+"0000"+winddowip+"0000010182";plcwrite += ID+"00000"+QString::number(IO); QByteArray data = QString2Hex(plcwrite); //字符串转16udpsocket->writeDatagram(data, QHostAddress(bindIP), quint16(bindPort.toInt()));}

读写反馈

void ReadPLC::Read_plc_data(){QByteArray datagram;datagram.resize(int(udpsocket->pendingDatagramSize()));udpsocket->readDatagram(datagram.data(),datagram.size());QString str = datagram.data();QString byte = datagram.toHex();if(!byte.isEmpty()){// qDebug()<<"16进制:"<<datagram.toHex();QString str_rev = QString(datagram.toHex(' ').toUpper().append(' '));qDebug()<<"data:"<<str_rev;//转换为字符}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。