plc报文如何分析?

299 2024-03-12 23:03

一、plc报文如何分析?

PLC通讯报文解释

一、 规则

(1)下行和上行报文分别用“发:”和“收:”区别开来。在颜色上也不同,发为绿色,收为蓝色。报文不论对错,只要是从串口和得到的数据都会显示出来。所以有时可以直接根据报文显示的情况发现一些问题。具体见第二大条。

(2)报头和报尾:所有完整报文帧的报头一定以字符“@”开始,最后以“*”和一个回车符(界面上是不可见的,但如果用鼠标左键选中报文尾部,是可以看到此字符确实存在且能够被选择,只是无法显示出来)结束。如果没有这两个明显的字符,此帧是无效帧,不会参与处理。

(3)PLC回应信息符(也就是指编程手册中的结束码):一共用两个字符来表示,这是对当前通讯状态的一个比较重要的指示,表示了本次问答的PLC与后台间数据的交换是否正常。具体各数值的意义见第二大条。本PLC回应信息符位于回答帧的第六和第七两个字符。如正常回答时,前面一部分报文会是:@01RD00 0000……。PLC回复的回应信息符就是这里的字符D后面紧跟的那两个字符。这里00是表示正常回应,如果FCS校验也正确的话,那么一切都OK,可以对本帧数据进行处理了。注意,如果是某些遥控或者强制等WR命令时,PLC回复的回应信息符就是字符R后面紧跟的那两个字符了。非00表示出错了。

(4)协议是遵守MODBUS协议的。所以如果对MODBUS协议有一定了解的话,本报文是很容易看懂的。无论上行还是下行报文,帧格式都为:

报头(即@)+ 机号 + 命令 + 起始地址 + 长度 + FCS校验 + 报尾(即 *+回车符 )

参考报文:

发:@01RD0020001155*

收:@01RD00 0001 300E 0000 0000 0000 0000 0000 0000 0000 0000 0000 55*

报头和报尾不再赘述。

机号:一号机为01,二号机为02,为PLC设置里面下传时设定,需对应起来。

命令:常用到的是读命令RD和写命令WR、WD。以前的另一种PLC型号出现过扩展区E区,所以对应还有RE,WE等命令。

起始地址:表示本帧的读或者写操作的对象区域开始处。与PLC程序里面的内存区完全对应。如协议中规定在PLC里面放置当前水机事故个数到D0020里面。那么上面例子中的RD0020….就会对从D0020这个寄存器开始读起。返回报文的第一个字就是D0020,也就是当前的事故条数了。

长度:要进行读或者写操作区域的长度。

FCS校验:PLC硬件自动响应上传报文及自动计算和校验FCS校验码,不用PLC程序进行额外的编写。

报文中各字符在程序中体现的数据含义的在参考说明书中的设置后,再结合看第三条的详细解释。

二、 出错提示

(1)报文是乱码,可能原因是RS422的接线出错,请仔细检查。也可能是PLC的第四个通讯拨码没有拨(一般发货前会在一楼联调时拨好)。

(2)运行过程中,数据不来,或者事故不上传,遥测遥信数据不对等其它不正常情况。首先是要根据回应信息符来判断,如果回应信息帧正确(为00),那么就要查是不是PLC程序中出了问题了。不为00时,要根据下面的列表来解决问题了。

字符

内容

可能原因

改正措施

00

正常完成

01

运行方式下不执行

PLC在运行方式下,不能执行发送的命令

检查命令和PLC模式之间的关系

02

监控方式下不执行

PLC在监控方式下,不能执行发送的命令

03

UM写保护

PLC的UM处于写保护

PLC上DIP开关的脚1置OFF

04

地址超出区域

设置在SV读命令或SV修改命令中地址超出65,535最大值

改正程序的地址设置,再传送命令

13

FCS错误

FCS计算错误或者噪声干扰

检查FCS、确定是否是噪声干扰

14

格式错误

命令格式错误或者不可分割的命令被分割

检查格式,再送命令

15

入口码数据错误

数据超出规定范围或太长

修改数据再传送传送命令

16

命令不不支持

程序中不存在SV读命令或SV修改命令中指定操作数

改正命令和程序

18

帧长度错误

超过最大的帧长度132个字节(如帧超过280个字节,接收溢出标志变ON,不再返回应答)

检查命令,必要是分成若干帧

19

不执行

读的项没有用组合命令(QQ)登记过

在批形式读之前,执行QQ命令登记读的项

23

用户存储器写保护

C200HX/HG/HG上DIP开关脚1为ON

置为OFF

A3

传送数据时因FCS错误引起中止

在第二帧或后面的帧中出现FCS错误

检查FCS计算方法、噪声干扰,再送

A4

传送数据时因格式错误引起中止

命令格式与第二或后面的帧中字节数不匹配

检查格式再传

A5

传送数据时因入口码数据错误引起中止

在第二或后面的帧中有入口码数据错误

修改数据再传送命令

A8

传送数据时因帧长度错误引起中止

第二或后面帧的长度超过最大值132个字节

保持帧不超过132字节

三、 具体举例说

选择的是黄洋口的报文,是一台PLC带两台机组,数据量比较密集点,所以回复报文的数据位置和常规使用的PLC中数据的摆放位置是略有提前了,但不影响此处对报文进行解释。

发:@01RD0020001155*

收:@01RD00 0000 300E 0410 A040 2508 1800 0200 0000 0000 0000 0000 55*

发:@01RD0031003056*

收:@01RD00 6101 5C01 6401 0100 3A01 3F01 3501 8A13 2439 9D0C D003 CE00 C900 CA00 F300 0F01 02F0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 22*

显然PLC的应答报文中的结束字符,也就是回应信息帧是正常的“00”,所以是正常报文。

报文按00200011,00310030,00610030,0091030的规则发下去,遥信和事故个数帧是十一个字一查询(根据协议第一个字是事故个数,后面十个连续字为遥信状态开关量),而每条遥测下发报文的“长度”字符是三十个字一加。

就上面的报文内容来讲:

遥信和事故个数帧内容包括:(1)无事故产生。(2)开关量有产生的,具体内容从0021~0030这十个字的二进制码来进行对位。分别对应第一个遥信到第一在六十个遥信量。

遥测帧说明了数据上正常上传,显示的是十六进制码。程序进行计算后转送到RDCSERVER中去让别的程序调用。

注意本处是特殊的协议所以没有讲电压、电流、功率等具体数据的位置,一般也用不到的。得到报文,再根据PLC.INI文件中的正确设置,程序会将各数据对应放好。

二、icmp报文分析?

各种ICMP报文的前32bits都是三个长度固定的字段:type类型字段(8位)、code代码字段(8位)、checksum校验和字段(16位) ,8bits类型和8bits代码字段一起决定了ICMP报文的类型。

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

三、terminal报文的分析?

终端地址 terminal address

系统中终端设备的地址编码,简称终端地址。

系统广播地址 system broadcast address

系统中所有终端都响应的地址编码。

终端组地址 terminal group address

具有某一相同属性的终端群组编码,如属于同一行业、同一变电站、同一线路,响应同一个命令。

主站地址 master station address

主站中具有通信需求的对象(如工作站、应用功能模块等)的编码。

电能示值 indicated energy value

电能表计度器电能示值的简称。

测量点 measured point

指可以测量出唯一的一组电气量值的测量装置与终端的顺序电气连接点,当物理上相同的一个电气连接点被多个装置所测量,或者被一个装置所测量但通过多种方式被传递到终端时,按照多个测量点计,每个测量点具有唯一的逻辑定位编码,是该装置在终端的参数配置、数据应用的唯一对象标识。

总加组 group total

指相关的各测量点的某一同类电气量值按设置的加或减运算关系计算得到的数值。

数据单元标识 Data unit identify

用于表示一个或一组信息点的一种或一组信息类型的标识。

信息点 information point

表示参数或数据的对象信息,如测量点、总加组、控制轮次、直流模拟量分路等。

信息类 information type

表示参数或数据的分类信息,一个信息类可以是一种参数或数据,也可以是一组参数或数据的集合。

任务 task

规定终端在指定时间或条件下执行所需的操作序列。

通信流量 communication flow

指由终端以本数据传输协议完整报文帧为基础统计的,与主站间的接收与发送报文帧的累计字节数。

四、canoe报文分析步骤?

首先使用CANoe软件前,要先设置Data base文件(简称DBC),DBC是将原始报文进行解析的转换工具。DBC编辑步骤如下:

1.CANoe菜单栏找到CANdb++Editor,并双击进入;

2.单击菜单File,单击Create Database;

3.单击选择第一个模板,然后点击OK,命名DBC文件名后进入DBC编辑界面;

4.右键单击Message,选择New,在Message的Definition界面中根据整车通讯协议定义对Message进行编辑

5.右键单击Signal,选择New,在Signal的Definition界面中根据整车通讯协议定义对Signal进行编辑;

6.Signal定义编辑完成之后,单击Message,选择Add,选择对应的Message并单击OK,将Signal关联至对应ID的Message

7.当通讯协议中如有类似“电机旋转方向”的报文,则需要编辑报文的Valuetable,编辑Valuetable按以下步骤进行;

①单击菜单栏View,选择Value tables后,单击空白处右键,选择New,根据通讯协议创建Value table;

②Value table创建完成后,保存,打开已创建的Signal,在其Definition界面中选择关联的Value table;

③通讯协议中类似电机转速的报文,则根据协议规定的系数和偏移量进行设置,无需设置Value table;

④信号创建完成后,检查信号的起始位置是否与通讯协议规定的一致

五、https报文分析方法?

HTTPS报文本身是加密的,wireshark也无法解析。因此需要将HTTPS生成的随机数(premaster-secret)提供给wireshark,wireshark才能正确解读密文。

具体配置方法(WINDOWS):

建立path变量 SSLKEYLOGFILE=c:\ssl.key

重启firefox/chrome,访问https网站会自动生成ssl session key

在wireshark中配置:编辑-首选项-Protocol-SSL-(Pre)-Master-Secret log filename 设置为之前配置的ssl.key文件,即可解密抓到的SSL密文

六、如何通过canoe分析已获取的报文?

可以通过以下步骤分析已获取的报文:1. 导入已获取的报文到canoe中;2. 在canoe中选择对应的报文格式和协议;3. 通过canoe提供的过滤器功能,筛选需要分析的报文;4. 利用canoe提供的图表和统计功能,对报文进行可视化分析;5. 可以结合canoe提供的控制台功能,进一步调试和测试已获取的报文。因为canoe作为一款专业的工具软件,提供了丰富的功能来帮助分析报文,而步骤清晰且易于操作。通过canoe分析已获取的报文,可以更加深入地理解报文传输过程中的性能和问题,提高分析效率和调试能力,从而更好地完成相关开发任务。

七、如何分析udp报文,从而获取源地址?

、写了一个UDP 的小程序,有一个UDP 的server,而且有UDP的client。

然后执行server和client,然后用tcpdump将该端口的UDP数据报文抓取出来。

执行的过程是这样的。

client向server发送"xiyou"

server向client应答"wangzhe"

client程序在主机example上运行(192.168.1.144)

server程序在主机linux上运行(192.168.1.101)

------------------------------------------------------------------------------------------------------------

2、UDP数据报文。

linux@linux:~$ sudo tcpdump -vvv -X udp port 7777

[sudo] password for linux:

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

11:03:01.923227 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 48)

example.local.43521 > linux.7777: [udp sum ok] UDP, length 20

0x0000: 4500 0030 0000 4000 4011 b677 c0a8 0190 E..0..@.@..w....

0x0010: c0a8 0165 aa01 1e61 001c 4c34 7869 796f ...e...a..L4xiyo

0x0020: 7500 0000 0000 0000 0000 0000 0000 0000 u...............

11:03:01.923343 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 48)

linux.7777 > example.local.43521: [bad udp cksum 6869!] UDP, length 20

0x0000: 4500 0030 0000 4000 4011 b677 c0a8 0165 E..0..@.@..w...e

0x0010: c0a8 0190 1e61 aa01 001c 8473 7761 6e67 .....a.....swang

0x0020: 7a68 6500 0000 0000 0000 0000 0000 0000 zhe.............

由上面的报文可知,有两个UDP数据报文。

第一个报文是example主机上的client向server发送数据。

4500 0030 0000 4000 4011 b677 c0a8 0190 c0a8 0165 这20个数据是IP首部。

aa01 1e61 001c 4c34 这8个字节是UDP的首部。

7869 796f 7500 0000 0000 0000 0000 0000 0000 0000 这20个数据是我用sendto函数发送的

数据。

而将char req[20] = "xiyou" 的ASCII码(16进制)就是:

78 69 79 6f 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

第二个报文是linux向主机example做出的应答。

4500 0030 0000 4000 4011 b677 c0a8 0165 c0a8 0190 这20个数据是IP首部。

1e61 aa01 001c 8473 这8个字节是UDP首部。

7761 6e67 7a68 6500 0000 0000 0000 0000 0000 0000 这20个数据是应用层的数据。

而将char reply[20] = "wangzhe"的ASCII码(16进制)就是:

77 61 6e 67 7a 68 65 0 0 0 0 0 0 0 0 0 0 0 0 0

由此看出,应用层的数据没有夹杂其他的参数,全部是数据,均是字符的ASCII码。

-----------------------------------------------------------------------

附带网络程序:

udp_server.c

#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <string.h>

int main(void)

{

struct sockaddr_in server,client;

int sockfd;

int cli_len = 0,n;

char req[20] = {0},reply[20] = {0};

sockfd = socket(AF_INET,SOCK_DGRAM,0);

if (sockfd < 0) {

perror("socket error!\n");

exit(-1);

}

memset(&server,0,sizeof(struct sockaddr_in));

server.sin_family = AF_INET;

server.sin_addr.s_addr = htonl(INADDR_ANY);

server.sin_port = htons(7777);

if (bind(sockfd,(struct sockaddr *)&server,sizeof(server)) < 0) {

perror("bind error!\n");

exit(-1);

}

for (;;) {

cli_len = sizeof(struct sockaddr_in);

n = recvfrom(sockfd,req,20,0,(struct sockaddr *)&client,&cli_len);

if (n < 0) {

perror("recvfrom error!\n");

exit(-1);

}

printf("hello!\n");

strncpy(reply,"wangzhe",sizeof("wangzhe"));

if (sendto(sockfd,reply,20,0,(struct sockaddr *)&client,sizeof(client)) != 20) {

perror("sendto error!\n");

exit(-1);

}

}

return 0;

}

-----------------------------------------------------------------------------------------------------------

udp_client.c

#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <string.h>

int main(void)

{

int sockfd,n;

struct sockaddr_in server;

char req[20]={0},reply[20]={0};

sockfd = socket(AF_INET,SOCK_DGRAM,0);

if (sockfd < 0) {

perror("socket error!\n");

exit(-1);

}

memset(&server,0,sizeof(server));

server.sin_family = AF_INET;

server.sin_addr.s_addr = inet_addr("192.168.1.101");

server.sin_port = htons(7777);

strncpy(req,"xiyou",sizeof("xiyou"));

printf("sendto req to server:%s\n",req);

if (sendto(sockfd,req,20,0,(struct sockaddr *)&server,sizeof(server)) != 20) {

perror("sendto error!\n");

exit(-1);

}

if ((n = recvfrom(sockfd,reply,20,0,(struct sockaddr *)NULL,(int *)NULL)) < 0) {

perror("recvfrom error!\n");

exit(-1);

}

printf("recv reply from server :%s\n",reply);

exit(0);

八、ensparp报文及流程分析实验?

报文并进行数据报分析 2、学会 ARP 命令,运用命定对 ARP 内容进行修改 3、ARP 安全与防护 二、实验目的: 1、学会抓取 ARP 报文,掌握 ARP 报文结构 2、掌握 ARP 命令,...

九、分析VLAN报文和非VLAN以太网报文的区别?

楼上正解, VLAN只是对数据封装签进行传输,仅在交换机进行,当数据出交换机时会将标签剥离,并不会改变数据的结构,当PC PING PC时,先检查自己的ARP缓存表,当缓存里没有时,会发ARP广播

十、发电机入相报文分析?

您好,这里提到的“入相报文”可能是指电力系统中发电机与电网之间的同步过程中,发电机向电网发送的一些信号,以便实现发电机与电网的同步运行。入相报文通常包括以下内容:

1. 同步信号:发电机向电网发送的同步信号,用于告知电网发电机的频率、相位等参数。

2. 电压信号:发电机向电网发送的电压信号,用于告知电网发电机的电压与频率是否符合要求。

3. 相序信号:发电机向电网发送的相序信号,用于告知电网发电机的相序是否正确。

4. 电流信号:发电机向电网发送的电流信号,用于告知电网发电机的电流大小与方向。

通过以上信号的交互,发电机与电网可以实现同步运行,从而确保电力系统的稳定运行。

顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
点击我更换图片