1.osi参考模型
2.
modbus是应用层报文传输协议,没有规定物理层,只规定了协议帧,但是定义了控制器能够认识和使用的消息结构,不管它们是经过何种网络进行通信的,具有很强的适应性。
一主多从,同一时间主机只能向一个从机发送请求, 如果主机没有像从机发送请求,从机不能主动发送数据给主机。
modbus没有忙判断,也就是说如果主机向从机发送请求,这时候从机正在处理别的任务或者没有收到,这时候不会响应主机,这是因为modbus只管传输数据,没有仲裁机制,需要通过软件方式判断是否正常接收。
modbus存储区分为四种,对应四种读取模式,输入线圈,输出线圈,输入寄存器,保持寄存器。输入线圈是只读布尔量,输出线圈是可读可写布尔量,输入寄存器是只读寄存器,保持寄存器是可读可写寄存器。
区号 | 名称 | 读写 | 地址范围 |
---|---|---|---|
0区 | 输出线圈 | 可读可写布尔量 | 00001-09999 |
1区 | 输入线圈 | 只读布尔量 | 10001-19999 |
3区 | 输入寄存器 | 只读寄存器 | 30001-39999 |
4区 | 保持寄存器 | 可读可写寄存器 | 40001-49999 |
主机向从机获取数据时,发送需要的数据起始地址,和数据长度,从机就会发送相对应的数据。
3.modbus传输模式ascii、rtu、tcp
modbus在串行链路上可以选择rtu或者ascii传输模式进行数据传输,rtu是通过16进制表示数据,ascii通过ascii码表示数据,每个8bit分成两个ascii码位表达数据,使用rtu传输时需要进行crc循环冗余校验,ascii需要进行lrc纵向冗余校验。当使用以太网进行数据传输时,选择tcp模式进行传输,tcp模式不需要校验,因为tcp模式是面向链接的可靠协议。
4.modbus rtu
modbus规定了二十多种功能码,常用的也就是下面8种。
功能码 | 功能说明 |
---|---|
01H | 读取输出线圈 |
02H | 读取输入线圈 |
03H | 读取保持寄存器 |
04H | 读取输入寄存器 |
05H | 写入单线圈 |
06H | 写入单寄存器 |
0FH | 写入多线圈 |
10H | 写入多寄存器 |
数据帧包括了从站地址、功能码、数据、crc校验
从机地址占一个字节-8位,因此可以表示2的8次方也就是256个设备,0-255,但是一般从机设备只能用1-254,从机地址写255也就是全写1的话表示广播信号,就是给所有的从站发送数据帧。
功能码一般占1字节大小-8位
数据没有固定长度
crc校验位一般占2字节数据-16位。
crc校验就是当主机给从机发送数据之前,根据从机地址到数据结束,计算出一个crc校验码,把这个crc校验码放在数据真的最末尾,当从机接收到主机发送的数据之后,根据主机发送来的数据,也用相同的方法计算出对应的crc校验码。然后和接收到的crc校验码相比较,如果相同,则证明发送的数据没有问题。
5.modbus ascii
modbus ascii数据帧包括 起始符 从机地址 功能码 数据 校验 结束符
起始符占一个字节
从机地址占两个字节
功能码占一个字节
数据占n个字节
校验占两个字节
结束符两个字节
可以看到相比rtu来说,数据帧更加繁琐,因此一般我们用modbus rtu。
modbus ascii用起始符和结束符作为分隔数据帧的标志,而modbus rtu没有这样的设计,modbus rtu需要时间间隔来分隔数据帧,一般两个数据帧之间至少间隔3.5个字符周期长度,否则就会发生粘包现象 。
粘包就是从机无法分清出每个独立的数据包。
6.modbus tcp
和modbus ascii相比,modbus tcp数据帧没有从机地址和校验位,反而在功能码之前多了一个mbap报文头。
最大数据长度260个字节。这个长度是mbap报文头里的长度位控制的,2的八次方256再加上长度控制符前面的四个字节就是260个字节。
事物处理标识箱:可以理解为报文的序列号,用于区别其他报文。
协议标识符:在这里0x00 0x00代表modbus协议
长度:长度表示从现在起到数据帧结束所有数据的长度大小。
单元标识符:类似于modbus rtu 、modbus ascii的从机地址,用来指示数据帧的目标地址。
7.tcp/ip协议
tcp/ip的应用层有http、ftp等,应用层是直接给用户使用的接口,传输层有tcp和udp,udp是不可靠的链接,tcp是面向链接的可靠服务,网络层中主要有ip、icmp,主要负责网络中的数据包传送,数据链路层有arp、rarp,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与传输媒介(如电缆或其他物理设备)的物理接口细节。
传输层:tcp、udp提供流量控制、差错控制,qos-服务质量等管理服务。
总的来说,tcp传输速度较低但是可靠性强,udp传输速度快但是可靠性较弱,是一个尽力传输的不可靠协议。
网络层:ip、icmp提供拥塞控制、网际互联等服务。
链路层:链路层又称数据链路层和网络接口层。用来处理网络的硬件接口部分。传输单位bit。
MAC地址具有唯一性:48位,厂家生产产品的时候,前24位1一般是制造商,后24位是系列号,由厂家自己分配,和身份证一样,在网络世界中是唯一的。
为什么不能用mac地址作为网关转发数据的依据?
因为mac地址是各个厂家自己分配的,如果需要作为网关进行数据的转发,那么需要这个mac地址的前几位相同,这样才能作为转发的依据,但是这显然是不现实的,在现实世界中,如果想这样做,要么你规定每片网络下都是同一厂家生产的设备,要么你规定厂家生产设备时,按照你的规则来生产mac地址。这显然是不可能的。
因此:ip地址应运而生。ip地址是32位的,定义在软件层面上,可以更改,mac是硬件层面上的,出厂时烧录在eprom上。
子网掩码:当我们给不在同一子网下的设备发送数据的时候,怎么知道他是否和我们的设备是不是在一个子网下呢。这就需要用到子网概念,发送数据包的时候,我们需要知道源ip和目标ip,这两个ip分别和提前设置好的子网掩码做与操作,如果与操作结果相同,则证明在同一片子网下,则不用发送给路由器,而是直接发送给交换机进行数据传输,如果与操作结果不同,则需要先把数据发送到路由器,经过路由器的转发才能实现数据传输。
默认网关:现在要把数据发送给不同子网下的设备,要先经过路由器,但是我们怎么知道路由器的ip地址呢,这时候就要用到默认网关,默认网关是提前设置在设备中的ip,也就是路由器的ip。
路由表:现在我们要把数据发送到不同子网下,可以实现发送到路由器了,但是路由器怎么知道把数据通过哪个网口进行转发呢,这时候就要用到路由表了,路由表记录着ip的前n位和端口的一一对应关系,路由表是在路由器记录的。和mac表类似,mac表记录着设备mac地址和集线器也就是交换机中端口的一一对应关系,mac表存在集线器/交换机中。
现在我要发送数据到别的设备,只知道ip地址怎么办呢,这时候要用arp缓存表。arp缓存表存着ip和mac地址的一一对应关系。
一开始这个表是空的,为了获得别的设备的mac地址,会先广播一条arp请求,接收到arp请求的设备会相应请求,发送自己的mac到源设备,这时候两边的设备会互相记录对方的ip和mac。这样多次请求之后会把arp缓存表补充完整。
在同一子网就直接获取对方mac地址;不在同一子网就获取默认网关的mac地址。
8.
tcp/ip数据传输的时候会发现,发送端发送的应用层报文会被逐步包裹起来,接收端接受的时候会一层一层剥开,得到应用层报文。
TCP/IP协议的数据封装和分用过程,大致如下图所示: