上位机读取udp的报文是实时的报文吗

上位机读取udp的报文是实时的报文吗,第1张

QT上位机与PLC通信
Fins/UDP通信
写格式
写反馈
读格式
读反馈
进制间转换函数
int-to-16进制
字符串-to-16进制
16进制-to-字符串
Fins/UDP通信
读写函数
读写反馈
Fins/UDP通信
编写上位机通过发送Fins/UDP命令读写plc内部数据,可以用于上位机socket通讯测试,员工 *** 作监控,运行日志打印。Fins/UDP是以十六进制字符发送命令,所以所有字符在发送前都需要将其转换成十六进制。
写格式
固定头:800002 不变
plc节点:006E00 地址:XXXXXXXXX110
PC节点:00F400 地址:XXXXXXXXX244
结束:00 不变
写代码:0102 不变
D区代码:82 不变
D区地址:01A600 根据需求修改,十六进制数据
写入长度:0001 根据需求修改,十六进制数据
写入数据:0212
登录后复制

写反馈
固定头:C00002 不变
PC节点:00F400 地址:XXXXXXXXX244
plc节点:006E00 地址:XXXXXXXXX110
结束:00 不变
写代码:0102 不变
写入成功:0000
登录后复制
读格式
固定头:800002 不变
plc节点:006E00 地址:XXXXXXXXX110
PC节点:00F400 地址:XXXXXXXXX244
结束:00 不变
读代码:0101 不变
D区代码:82 不变
D区地址:01A600 根据需求修改,十六进制数据
读取长度:0002 根据需求修改,十六进制数据

登录后复制
读反馈
固定头:C00002 不变
PC节点:00F400 地址:XXXXXXXXX244
plc节点:006E00 地址:XXXXXXXXX110
结束: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 = strlength();
senddataresize(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;
else
hexdata = hexdata16+lowhexdata;
i++;
senddata[hexdatalen] = (char)hexdata;
hexdatalen++;
}
senddataresize(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 = bindIPsplit("")at(3)toInt();
plcip = QString::number(plcIPEnd,16)toUpper();
int winIPEnd = winIPsplit("")at(3)toInt();
winddowip = QString::number(winIPEnd,16)toUpper(); //得到win的十六进制
if(plcipsize()==1){
plcip = "0"+plcip;
}
if(winddowipsize()==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); //字符串转16
udpsocket->writeDatagram(data, QHostAddress(bindIP), quint16(bindPorttoInt()));
}
登录后复制

读写反馈
void ReadPLC::Read_plc_data()
{
QByteArray datagram;
datagramresize(int(udpsocket->pendingDatagramSize()));
udpsocket->readDatagram(datagramdata(),datagramsize());
QString str = datagramdata();
QString byte = datagramtoHex();
if(!byteisEmpty())
{
// qDebug()<<"16进制:"<<datagramtoHex();
QString str_rev = QString(datagramtoHex(' ')toUpper()append(' '));
qDebug()<<"data:"<<str_rev;
//转换为字符
}
}
登录后复制

售后服务点地址:上海市徐汇区肇嘉浜路1065号甲飞雕国际大厦705室
联系电话:021-31275078-55704
工作时间:周一-周六10:00-18:30
注意:服务中心地址、营业时间等信息后续可能会有变更,请以官网公布的最新信息为准。

1、金海马家具
地址: 上海华山路1988号4楼(广元路口)
2、徐家汇家具世界总汇
地址: 上海市文定路202号
3、喜盈门家具城
地址: 上海裕德路126号(近徐家汇家世界)

1手机系统费电。有些版本的系统确实耗电大,建议你更新一下系统试试看能否解决。
2主板漏电。主板漏电比较麻烦,电源会自动损失,这种情况必须找专业维修才能解决。
3手机设置问题。你查看一下手机的设置,比如通知功能是否允许所有软件全部获取了权限。再看隐私,位置获取是不是都是打开的,导致GPS连接耗费电量。
4、也可联系苹果售后


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/10401043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-08
下一篇 2023-05-08

发表评论

登录后才能评论

评论列表(0条)

保存