modbus实例
modbus报文实例
modbus报文实例Modbus报文实例Modbus是一种用于在工业自动化系统中进行通信的协议。
它是一种简单、可靠且广泛使用的协议,被广泛应用于监控、控制和数据采集等领域。
在Modbus通信中,数据是通过报文进行传输的。
本文将以Modbus报文实例为标题,介绍Modbus报文的结构和常见的实例。
一、Modbus报文结构Modbus报文由不同的字段组成,每个字段都有特定的含义和作用。
一个完整的Modbus报文包括以下几个字段:1. 起始符:Modbus报文以起始符开始,用于标识报文的开始。
2. 地址:地址字段用于标识Modbus设备的地址,用于指定通信的目标设备。
3. 功能码:功能码用于指示报文的目的和操作类型。
不同的功能码对应不同的操作,例如读取数据、写入数据等。
4. 数据:数据字段用于存储报文中传输的数据。
根据不同的功能码,数据可以是读取的数据、写入的数据或其他操作所需要的参数。
5. 校验码:校验码用于验证报文的完整性和正确性。
校验码的计算通常使用CRC或LRC算法。
6. 结束符:结束符用于标识报文的结束。
二、Modbus报文实例下面以几个常见的Modbus报文实例来说明报文的结构和用法。
1. 读取线圈状态(功能码:0x01)读取线圈状态是Modbus中常用的操作之一,用于读取远程设备中的线圈状态。
下面是一个读取线圈状态的Modbus报文实例:起始符地址功能码起始地址数据长度校验码结束符0x01 0x01 0x01 0x0000 0x0001 0x1D 0x0D 0x0A在这个报文中,起始符为0x01,地址为0x01,功能码为0x01,起始地址为0x0000,数据长度为0x0001,校验码为0x1D,结束符为0x0D 0x0A。
2. 写入单个线圈(功能码:0x05)写入单个线圈用于控制远程设备中的单个线圈状态。
下面是一个写入单个线圈的Modbus报文实例:起始符地址功能码线圈地址数据校验码结束符0x01 0x01 0x05 0x0000 0xFF00 0x8C 0x0D 0x0A在这个报文中,起始符为0x01,地址为0x01,功能码为0x05,线圈地址为0x0000,数据为0xFF00,校验码为0x8C,结束符为0x0D 0x0A。
python 的modbus从站和主站实例
一、概述Python是一种强大的编程语言,被广泛应用于各个领域。
而在工业自动化领域,Modbus通信协议也是被广泛采用的一种通信协议。
在本文中,我们将介绍如何使用Python编写Modbus从站和主站的实例,并且通过实例来展示Modbus通信协议的应用。
二、Modbus通信协议简介Modbus是一种串行通信协议,用于在工业领域传输数据。
它包括Modbus ASCII、Modbus RTU和Modbus TCP/IP等不同变种。
Modbus协议支持主从通信模式,其中主站负责发送请求命令,而从站则负责响应这些请求命令并返回相应的数据。
三、Python编写Modbus从站实例1. 导入Modbus通信库在Python中编写Modbus从站实例之前,我们需要先导入相应的Modbus通信库,例如pyModbus、pymodbus-tk等。
2. 配置从站参数在编写Modbus从站实例时,我们需要配置从站的参数,包括从站位置区域、通信端口号等。
这些参数通常由工程师根据实际情况来配置。
3. 响应主站请求通过编写相应的逻辑代码,从站能够响应主站发送过来的请求命令,并根据命令内容来执行相应的操作,最后返回数据给主站。
四、Python编写Modbus主站实例1. 导入Modbus通信库与编写Modbus从站实例类似,首先需要导入Modbus通信库,以便在Python中编写Modbus主站实例。
2. 配置主站参数主站实例需要配置主站的参数,包括主站位置区域、通信端口号等参数,同样由工程师根据实际情况来配置。
3. 发送请求命令主站通过发送请求命令来获取从站的数据,请求命令通常包括读取寄存器、写入寄存器等操作。
4. 处理从站响应主站在发送请求命令后,需要处理从站的响应,并根据从站返回的数据来进行相应的处理。
五、Modbus从站和主站实例的应用通过编写的Modbus从站和主站实例,我们能够在工业自动化系统中实现数据的读取和写入操作。
modbus 协议例子
发送
01
03
00
06
00
03
E5
CA
格式
站号
功能
起始地址
字数
CRC低
CRC高
回应
01
03
06
00 0400 0300 02
A1
74
格式
站号
功能
字数
数值
CRC低
CRC高
4、功能04H:以字为单位读模拟量输入值AIn
与前一项类似
5、功能05H:将单个Q点置位或置零(ff 001;00 000)
结果:Q0.7-Q0.0全为零
发送
01
0F
00
00
00
10
02
0FF0
E7
94
格式
站号
功能
起始地址
点数
字节数
操作值
CRC低
CRC高
回应
01
0F
00
格式
站号
功能
起始地址
点数
××
CRC低
CRC高
结果:Q1.7-Q1.0 Q0.7-Q0.0
1111 0000 0000 1111
8、功能10H:写多V变量
备注:×表示无此项
1、功能01H:读Qn
发送
01
01
00
00
00
08
3D
CC
格式
站号
功能
起始地址
点数
CRC低
CRC高
回应
01
01
01
55
×
×
91
B7
格式
站号
modbus tcp通讯案例
modbus tcp通讯案例Modbus TCP通信是一种常用的工业通信协议,用于实现设备之间的数据交换。
下面列举了10个与Modbus TCP通信相关的案例,以帮助读者更好地理解该协议的应用。
1. 工业自动化控制:Modbus TCP通信常用于工业自动化领域,如控制系统与PLC之间的数据交换。
通过Modbus TCP协议,可以实现远程监控和控制各种工业设备,提高生产效率和质量。
2. 电力监控与管理:Modbus TCP通信可以用于电力系统的实时监测和远程管理。
例如,通过与电能表等设备进行通信,可以获取电力消耗数据并进行分析,以便进行能源管理和优化。
3. 温湿度监测:Modbus TCP通信可以用于温湿度传感器与监控系统之间的数据传输。
通过与温湿度传感器进行通信,可以实时获取环境温湿度信息,以便进行空调控制和环境监测。
4. 智能家居控制:Modbus TCP通信可以用于智能家居系统中各种设备的远程控制和监测。
例如,通过与智能插座、智能灯泡等设备进行通信,可以实现远程开关和亮度调节。
5. 水处理控制:Modbus TCP通信可以用于水处理系统中的控制和监测。
例如,通过与水泵、流量计等设备进行通信,可以实现远程控制和监测水处理过程,提高水质和节约能源。
6. 风力发电控制:Modbus TCP通信可以用于风力发电系统的控制和监测。
通过与风力发电机组进行通信,可以实时获取发电量和转速等数据,以便进行运维管理和故障诊断。
7. 网络监控与管理:Modbus TCP通信可以用于网络设备的监控和管理。
通过与路由器、交换机等设备进行通信,可以实时获取网络流量和设备状态信息,以便进行故障排除和优化网络性能。
8. 物流追踪与管理:Modbus TCP通信可以用于物流追踪与管理系统中的数据传输。
例如,通过与RFID读写器进行通信,可以实时获取货物的位置和状态信息,以便进行物流调度和跟踪。
9. 智能停车系统:Modbus TCP通信可以用于智能停车系统中的数据交互。
modbus协议通信实例
modbus协议通信实例Modbus协议是一种常用的工业通信协议,它可以实现不同设备之间的数据交换。
下面将介绍一个Modbus协议通信的实例。
在这个实例中,我们需要将一个温度传感器的数据传输到PLC控制器上。
首先,我们需要选择一个支持Modbus协议的温度传感器和PLC 控制器。
在这个实例中,我们选择了一个支持Modbus RTU协议的温度传感器和PLC控制器。
接下来,我们需要配置温度传感器和PLC控制器的Modbus通信参数。
在这个实例中,我们选择了9600波特率、8数据位、无校验位和1停止位。
我们还需要为温度传感器和PLC控制器分配Modbus地址。
在这个实例中,我们将温度传感器的Modbus地址设置为1,将PLC控制器的Modbus地址设置为2。
现在,我们可以开始编写PLC控制器的程序。
在这个实例中,我们使用了一个Modbus RTU通信模块来实现PLC控制器与温度传感器之间的通信。
我们需要在PLC控制器的程序中添加Modbus RTU通信模块,并配置通信参数和Modbus地址。
然后,我们需要编写一个读取温度传感器数据的程序,并将数据存储到PLC控制器的内存中。
在温度传感器和PLC控制器之间建立通信后,我们可以使用Modbus 调试工具来测试通信是否正常。
在这个实例中,我们使用了一个Modbus调试工具来读取温度传感器的数据。
我们需要在Modbus调试工具中设置通信参数和Modbus地址,并发送读取数据的命令。
如果通信正常,我们将能够读取到温度传感器的数据。
最后,我们可以在PLC控制器的HMI界面上显示温度传感器的数据。
在这个实例中,我们使用了一个数码管来显示温度传感器的数据。
我们需要在PLC控制器的程序中添加一个数码管,并将温度传感器的数据显示在数码管上。
总之,Modbus协议是一种常用的工业通信协议,它可以实现不同设备之间的数据交换。
在这个实例中,我们使用了Modbus RTU协议来实现温度传感器和PLC控制器之间的通信,并将温度传感器的数据显示在PLC控制器的HMI界面上。
modbus rtu案例
modbus rtu案例Modbus RTU是一种串行通信协议,用于在工业自动化领域中的设备之间进行通信。
它是Modbus协议的一种变体,采用二进制编码,具有高效、可靠、简单等特点。
下面是一些Modbus RTU案例:1. 工业自动化控制系统:Modbus RTU广泛应用于工业自动化控制系统中,例如PLC、HMI、传感器、执行器等设备之间的通信。
通过Modbus RTU协议,这些设备可以实现数据的读取、写入、控制等功能,从而实现自动化控制。
2. 智能家居系统:Modbus RTU也可以应用于智能家居系统中,例如智能灯光、智能窗帘、智能门锁等设备之间的通信。
通过Modbus RTU协议,这些设备可以实现远程控制、状态查询等功能,从而实现智能化控制。
3. 太阳能光伏发电系统:Modbus RTU可以应用于太阳能光伏发电系统中,例如逆变器、电池、电表等设备之间的通信。
通过Modbus RTU协议,这些设备可以实现数据的读取、写入、控制等功能,从而实现太阳能光伏发电系统的监控和管理。
4. 汽车电子系统:Modbus RTU也可以应用于汽车电子系统中,例如发动机控制模块、传感器、执行器等设备之间的通信。
通过Modbus RTU协议,这些设备可以实现数据的读取、写入、控制等功能,从而实现汽车电子系统的控制和监测。
5. 智能交通系统:Modbus RTU可以应用于智能交通系统中,例如交通信号灯、车辆检测器、路况监测器等设备之间的通信。
通过Modbus RTU协议,这些设备可以实现数据的读取、写入、控制等功能,从而实现智能交通系统的控制和管理。
6. 智能电网系统:Modbus RTU也可以应用于智能电网系统中,例如电力监测仪、电力负荷控制器、电力调度器等设备之间的通信。
通过Modbus RTU协议,这些设备可以实现数据的读取、写入、控制等功能,从而实现智能电网系统的监控和管理。
7. 智能农业系统:Modbus RTU可以应用于智能农业系统中,例如温室控制器、水肥控制器、气象监测器等设备之间的通信。
MODBUS实例485通讯
MODBUS实例485通讯用RS485端口控制TVF2000使用说明:一、硬件连接:1.RS485/RS485:(1)终端设备:将J2用终端方式短接;(2)非终端设备:将J2用非终端方式短接;(3)A、B、AGND对接;(4)如果使用屏蔽线,SCR对接。
2.RS485/RS232(PC机):(1)用RS485/RS232转换器;(2)PC机串口与转换器RS232口连接;(3)TVF2000的CN1与转换器的RS485口的A、B、AGND连接。
二、用MODBUS与TVF2000通讯(RTU方式):1.TVF2000键盘设置:a)键盘菜单设置说明:i.1001=10:外端子1用通讯控制;ii.5005=2:标准MODBUS通讯方式;iii.5201=1-247:从机号(缺省=1);iv.5202=5:通讯速度为9600bps(缺省=5);v.5203=0:无效验(缺省=0);vi.其它=缺省值;b)键盘具体操作:i.9952 = 1:参数初始化;ii.1001 = 10;iii.5005 = 2;这样设置后,就可以与TVF2000通讯了。
2.TVF2000使用的MODBUS命令:a)读存储寄存器:03命令;b)写单个寄存器:06命令;c)写多个寄存器:16命令;3.MODBUS单寄存器写入命令说明(其它说明见附录):a)主机发送:i.[地址]:从机地址1-247;ii.[命令]:06,单寄存器写入命令;iii.[寄存器地址_H]:寄存器地址高8位;iv.[寄存器地址_L]:寄存器地址低8位;v.[数据_H]:写入数据高8位;vi.[数据_L]:写入数据低8位;vii.[CRC_H]:CRC效验高8位;viii.[CRC_L]:CRC效验低8位;b)从机返回(正常):i.[地址]:从机地址1-247(相同地址);ii.[命令]:06,单寄存器写入命令;iii.[寄存器地址H]:寄存器地址高8位;iv.[寄存器地址L]:寄存器地址低8位;v.[数据_H]:写入数据高8位;vi.[数据_L]:写入数据低8位;vii.[CRC_H]:CRC效验高8位;viii.[CRC_L]:CRC效验低8位;c)通讯具体操作(菜单1102=7为例):i.主机发送:[01][06][04][4E][00][07][CRC_H][CRC_L];ii.从机返回(正常):[01][06][04][4E][00][07][CRC_H][CRC_L];4.用通讯命令设置菜单值(调速前必须设置):i.1102=7;外部1有效;ii.1103=8;由串行通讯给定;iii.0002=初始频率;如果不设置,为菜单1104的值;iv.0001=0x06;命令寄存器:0001;v.0001=0x0f;vi.0001=0x2f;启动;vii.0001=0x6f;到达设定频率;5.用通讯命令调速(给定寄存器1:0002):i.0002=0-20000;调速:0对应1104的值,20000对应1105的值;ii.通过03命令读取状态寄存器(0004)的值;iii.通过03命令读取保持寄存器(0005、0006)的值;用通讯命令停车:0001 = 0x06;6.。
modbustcp实例
modbustcp实例
以下是一个基于Modbus TCP的实例:
PLC作为服务器,IP地址为192.168.6.101,端口号为502。
电脑作为客户端,通过该IP和端口号连接PLC,并进行数据监控。
在数据监控界面,可以查看和读取不同区域(如X、Y、M、D等)的数据。
通过一个自己编写的C#程序,可以实现与PLC的连接和数据的读写。
程序可以读取PLC中不同区域的数据,例如X区的信号状态、Y区的输出状态、M区的内部状态等,同时也可以写入数据到PLC的不同区域,实现对PLC的控制。
在演示过程中,展示了如何连续读取和写入多个数据,并通过数据监控界面实时验证操作的结果。
同时,还说明了如何同时写入多个值,比如在D区写入一组数据,并通过程序读取验证。
总的来说,TCP-Modbus通信是一种高效的方式,通过它可以轻松实现与PLC的数据交互和控制。
通过编写程序,并使用相关的类库,能够更加灵活地操作PLC,实现各种功能。
modbus协议例子
modbus协议例子Modbus协议是一种通信协议,用于在工业自动化系统中传输数据。
它被广泛应用于监控和控制设备之间的通信。
下面是一些使用Modbus协议的实际例子:1. 工业自动化控制系统:Modbus协议常用于连接PLC(可编程逻辑控制器)和其他设备,如传感器、执行器和人机界面。
通过Modbus 协议,PLC可以与其他设备进行数据交换,实现自动化控制。
2. 太阳能发电系统监控:Modbus协议可以用于监控太阳能发电系统中各个组件的状态和性能。
例如,通过Modbus协议,可以实时获取太阳能电池板的电压、光照强度和输出功率等信息,以便进行系统优化和故障排除。
3. 能源管理系统:Modbus协议可以用于监控和控制能源管理系统中的各个设备,如电表、电池、逆变器等。
通过Modbus协议,可以实时获取能源消耗情况、电池状态和逆变器运行状态等信息,以便进行能源优化和节能管理。
4. 智能家居系统:Modbus协议可以用于智能家居系统中各个设备之间的通信。
例如,通过Modbus协议,可以实现智能灯控制器与智能开关、智能窗帘控制器和智能温控器之间的数据交换,实现智能家居的自动化控制。
5. 智能交通系统:Modbus协议可以用于智能交通系统中的信号灯控制器和交通监控设备之间的通信。
通过Modbus协议,可以实时获取交通信号灯的状态和交通流量等信息,以便进行交通管理和优化。
6. 智能农业系统:Modbus协议可以用于智能农业系统中的各个设备之间的通信。
例如,通过Modbus协议,可以实时获取温室中的温度、湿度和光照强度等信息,以便进行温室控制和作物生长管理。
7. 智能楼宇系统:Modbus协议可以用于智能楼宇系统中各个设备之间的通信。
例如,通过Modbus协议,可以实现楼宇自动化控制器与空调、照明和安防设备之间的数据交换,实现楼宇的智能化管理和节能优化。
8. 工业设备监控系统:Modbus协议可以用于监控工业设备的状态和性能。
modbus tcp和modbusrtu 实例
Modbus TCP和Modbus RTU是工业控制领域中常用的通信协议,它们在工业自动化控制系统中扮演着重要的角色。
本文将介绍Modbus TCP和Modbus RTU的基本概念、工作原理以及实例应用。
一、Modbus TCP和Modbus RTU的概念1.1 Modbus TCPModbus TCP是一种基于以太网的Modbus通信协议,它使用TCP/IP协议作为传输媒介,可以实现在局域网或广域网中的设备之间进行实时数据通信。
Modbus TCP采用标准的Modbus协议格式,具有数据传输快速、稳定可靠等特点,广泛应用于工业自动化控制系统中。
1.2 Modbus RTUModbus RTU是一种基于串行通信的Modbus通信协议,它采用二进制编码的方式进行数据传输,具有传输速度快、占用系统资源少等特点。
Modbus RTU通常应用于工业现场设备之间的通信,如PLC、传感器等设备之间的数据交换和控制。
二、Modbus TCP和Modbus RTU的工作原理2.1 Modbus TCP的工作原理Modbus TCP采用客户端-服务器模式进行通信,客户端发起数据请求,服务器端响应请求并返回数据。
通信过程中,客户端通过TCP/IP协议向服务器端发送数据请求,服务器端接收请求并根据请求进行响应,完成数据的读写操作。
Modbus TCP通信的数据包格式包括事务标识、协议标识、长度字段、单元标识、功能码、数据域等字段,通过这些字段完成数据的传输和交换。
2.2 Modbus RTU的工作原理Modbus RTU采用主从站方式进行通信,主站负责发起数据请求,从站响应主站的请求并返回数据。
通信过程中,主站通过串行通信方式向从站发送数据请求,从站接收请求并根据请求进行响应,完成数据的读写操作。
Modbus RTU通信的数据包格式包括位置区域码、功能码、数据等字段,通过这些字段完成数据的传输和交换。
三、Modbus TCP和Modbus RTU的实例应用3.1 Modbus TCP的实例应用以太网通信的Modbus TCP协议在工业控制中有着广泛的应用。
modbus rtu协议实例
MODBUS RTU协议实例什么是MODBUS RTU协议?MODBUS RTU协议是一种通信协议,用于在工业自动化中实现设备与设备之间的通信。
它是MODBUS协议的一种变体,采用二进制格式传输数据,常用于串行通信。
MODBUS RTU通信格式MODBUS RTU协议使用了一种简单而高效的通信格式,包含以下部分:1. 起始位每个数据帧的开始由一个起始位标识,通常是一个低电平信号。
2. 设备地址设备地址标识了通信中的从设备。
MODBUS RTU允许最多247个从设备,设备地址范围为1-247。
3. 功能码功能码指定了通信中要执行的操作,如读取寄存器、写入寄存器等。
功能码的范围为1-127。
4. 数据域数据域包含了要传输的实际数据,如寄存器的值。
5. CRC校验CRC校验用于验证数据的准确性,以确保数据在传输过程中没有发生错误。
6. 结束位结束位标识了数据帧的结束,通常是一个高电平信号。
MODBUS RTU通信流程MODBUS RTU通信流程包括以下步骤:1.主设备向从设备发送请求。
2.从设备接收请求,并执行相应的操作。
3.从设备将响应数据发送回主设备。
4.主设备接收响应数据,并根据需要解析和处理数据。
MODBUS RTU实例以下是一个简单的MODBUS RTU通信实例,以读取温度传感器的数据为例:步骤1:建立通信1.使用串口连接主设备和从设备。
2.配置串口参数,如波特率、数据位、停止位等。
步骤2:发送请求1.主设备构建MODBUS RTU请求帧,设置设备地址和功能码。
2.将请求帧发送给从设备。
步骤3:接收响应1.从设备接收请求帧。
2.从设备执行相应的操作,读取温度传感器的数据。
3.从设备构建MODBUS RTU响应帧,设置设备地址和功能码,并在数据域中填充温度传感器的数据。
4.从设备发送响应帧给主设备。
步骤4:处理响应1.主设备接收响应帧。
2.主设备解析响应帧,提取出温度传感器的数据。
3.主设备根据需要进行进一步处理,如显示数据、保存数据等。
modbus_receive 使用实例
一、Modbus协议简介Modbus是一种串行通信协议,用于在工业自动化领域中的控制器、传感器和其他设备之间进行通信。
它采用主从架构,支持多种不同的物理层和传输方式。
Modbus协议包括Modbus RTU(Remote Terminal Unit)、Modbus ASCII和Modbus TCP/IP。
其中,Modbus RTU是一种使用二进制编码的串行通信协议,适用于传统的串口通信;Modbus ASCII是使用ASCII编码的串行通信协议,用于带有Parity Bit的串口通信;Modbus TCP/IP是基于以太网的协议,可实现远程通信。
二、modbus_receive的作用modbus_receive是一个用于接收Modbus协议数据的函数或模块。
在很多工业自动化控制系统中,需要通过Modbus协议与其他设备进行通信,而modbus_receive的作用就是接收来自其他设备的Modbus数据包,然后进行解析和处理。
三、modbus_receive的具体实现modbus_receive的具体实现方式可以根据不同的编程语言和环境而异。
以Python为例,可以使用第三方库pymodbus来实现modbus_receive函数。
以下是一个简单的Python示例代码:```pythonfrom pymodbus.client.sync import ModbusSerialClient asModbusClientclient = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600)client.connect()rr = client.read_coils(1,10)print(rr.bits)r = client.read_input_registers(0,8,unit=0x01)print(r.registers)client.close()```在上面的示例代码中,首先使用pymodbus建立了与Modbus从设备的连接,然后通过client.read_coils和client.read_input_registers 来分别接收线圈和输入寄存器的数据。
基于stc单片机modbus实例
基于stc单片机modbus实例
STC单片机是一种常见的单片机系列,而Modbus是一种常用的工业通信协议。
基于STC单片机实现Modbus通信可以用于各种工业控制和自动化系统中。
下面我将从硬件和软件两个方面来介绍基于STC单片机的Modbus实例。
硬件方面:
1. 选择合适的STC单片机,首先需要选择一款适合的STC单片机作为硬件平台,常见的有STC89系列等。
2. 串口通信,Modbus通信通常使用串口进行数据传输,因此需要在单片机上配置串口通信功能,包括波特率、数据位、停止位等参数的设置。
3. 连接外部设备,如果需要与其他设备进行Modbus通信,需要将STC单片机与外部设备(如传感器、执行器等)进行连接,通常是通过串口或其他通信接口进行连接。
软件方面:
1. 编写Modbus协议栈,在STC单片机上实现Modbus通信需要
编写Modbus协议栈,包括实现Modbus的数据帧格式、功能码解析、CRC校验等功能。
2. 数据处理,根据具体的应用场景,需要在单片机上实现数据
的采集、处理和响应,包括读取传感器数据、控制执行器等操作。
3. 调试和测试,在软件开发完成后,需要进行调试和测试,确
保STC单片机能够正常地与其他设备进行Modbus通信。
总结:
基于STC单片机的Modbus实例涉及到硬件和软件两个方面,需
要选择合适的单片机型号并配置串口通信功能,同时编写Modbus协
议栈和实现数据处理逻辑。
在实际应用中,还需要考虑通信稳定性、数据安全性等因素,确保系统能够稳定可靠地运行。
希望以上信息
能够对你有所帮助。
modbus协议 例子
modbus协议例子Modbus协议是一种通信协议,用于建立主从设备之间的通信连接。
它被广泛应用于工业自动化领域,用于实现设备之间的数据交换和控制操作。
下面将列举10个以Modbus协议为例的应用场景和使用方法。
1. 控制器与传感器的数据交换:Modbus协议可以用于控制器与传感器之间的数据交换。
控制器作为Modbus主机,通过Modbus协议读取传感器的数据,实现对传感器的监控和控制。
2. 设备与上位机的通信:Modbus协议可以用于设备与上位机之间的通信。
上位机作为Modbus主机,通过Modbus协议读取或写入设备的数据,实现对设备的控制和监测。
3. 远程数据采集系统:Modbus协议可以用于远程数据采集系统。
通过Modbus协议,可以实现对远程设备的数据采集和监控,方便实时获取设备状态和数据信息。
4. 工业自动化控制系统:Modbus协议广泛应用于工业自动化控制系统。
通过Modbus协议,可以实现对各个设备的数据采集、传输和控制,实现工业过程的自动化控制。
5. 电力监控系统:Modbus协议可以用于电力监控系统。
通过Modbus协议,可以实现对电力设备的实时监测和控制,提高电力系统的运行效率和安全性。
6. 楼宇自动化系统:Modbus协议可以用于楼宇自动化系统。
通过Modbus协议,可以实现对楼宇设备的集中控制和监测,实现楼宇的智能化管理。
7. 温湿度监测系统:Modbus协议可以用于温湿度监测系统。
通过Modbus协议,可以实现对温湿度传感器的数据采集和监测,方便实时获取环境温湿度信息。
8. 智能家居系统:Modbus协议可以用于智能家居系统。
通过Modbus协议,可以实现对智能家居设备的控制和监测,实现家居的智能化管理和控制。
9. 智能交通系统:Modbus协议可以用于智能交通系统。
通过Modbus协议,可以实现对交通设备的控制和监测,提高交通系统的运行效率和安全性。
10. 医疗设备监控系统:Modbus协议可以用于医疗设备监控系统。
modbus定时轮询实例
modbus定时轮询实例Modbus是一种通信协议,用于在自动化设备之间进行数据交换。
定时轮询是一种常见的Modbus通信方式,通过定时发送请求来周期性地查询设备数据。
下面是一个关于Modbus定时轮询的实例和相关参考内容。
首先,我们来看一个Modbus定时轮询的实例。
假设我们有一组传感器,每隔1秒钟向主控制器发送当前温度和湿度数据。
主控制器通过Modbus通信协议与传感器进行数据交换。
以下是一个简单的代码示例:```pythonimport minimalmodbusimport time# 创建Modbus设备device = minimalmodbus.Instrument('/dev/ttyUSB0', 1) # 使用串口USB0,从机地址1# 设置Modbus参数device.serial.baudrate = 9600 # 波特率device.serial.bytesize = 8 # 数据位device.serial.parity = minimalmodbus.serial.PARITY_NONE # 奇偶校验device.serial.stopbits = 1 # 停止位device.serial.timeout = 0.05 # 超时时间# 定时轮询while True:try:temperature = device.read_register(0, 1) # 读取温度寄存器 humidity = device.read_register(1, 1) # 读取湿度寄存器print(f'Temperature: {temperature}, Humidity: {humidity}') except Exception as e:print(f'Error: {e}')time.sleep(1) # 延迟1秒```在上述实例中,我们使用了`minimalmodbus`库来与Modbus设备进行通信。
(完整word版)modbus通讯协议实例
上海安标电子有限公司
——PC39A接地电阻仪通信协议
通信协议:
波特率:9600数据位:8校验位:无停止位:1
上位机(计算机):
注:1 ID:1个字节,由单机来定(0~255)
2 Command:1个字节,读:3或4,写:6
3 数据地址:2个字节,寄存器地址,读从100开始,写从200开始
4 Value:2个字节,读:个数(以整型为单位),写:命令/ 数据(以整型为单位)
5 CRC:计算出CRC
下位机(PC39A):
注:1 ID:1个字节,由单机来定(0~255)
2 Command:1个字节,收到的上位机命令
3数据个数:1个字节,返回数据个数(以字节为单位)
4 Value:N个字节,是返回上位机的数据
5 CRC:计算出CRC
写命令,若正确
返回收到的数据:
若错误
注:1 ID:1个字节,由单机来定(0~255)
2 Command:1个字节,收到的上位机命令或上0x80,
如收到3,返回0x83
3数据:1个字节,错误的指令
错误指令
1:表示command不存在
2:表示数据地址超限
4 CRC:计算出CRC
例如读PC39A电流数据:
机器地址为12,电流的数据地址100,数据为15.45(A) (一个整型数据)
从机返回
如正确:
如错误:
例如发PC39A启动命令:
机器地址为12,命令的地址200,数据为25000(25000表示启动)
主机:
从机返回。
modbus通讯案例
modbus通讯案例Modbus 通讯案例研究:一个光伏系统监控解决方案背景某光伏发电厂需要一个可靠的监控系统来远程监视和管理其光伏阵列。
该系统必须能够收集有关发电量、系统状态和环境条件的数据,并通过 Modbus RTU 协议将其传输到中央监控站。
系统架构监控系统由以下组件组成:Modbus 主站:负责轮询 Modbus 从站并收集数据。
Modbus 从站:连接到光伏逆变器,负责提供发电量、系统状态和环境条件数据。
通信网关:将 Modbus RTU 转换为以太网协议,以便远程访问。
中央监控站:运行监控软件,显示收集到的数据并在出现问题时发出警报。
Modbus 通信协议Modbus RTU 是一种半双工串行通信协议,用于在主站和从站之间交换数据。
它使用简单的请求-响应机制,其中主站发送请求,从站发送响应。
Modbus 请求由以下字段组成:设备地址(1-255)功能代码(01、02、03 等)起始地址数目数据(可选)Modbus 响应由以下字段组成:设备地址(1-255)功能代码(01、02、03 等)字节数数据系统实施系统实施涉及以下步骤:将 Modbus 从站连接到光伏逆变器。
配置 Modbus 主站和从站的设备地址。
将通信网关连接到 Modbus 主站和以太网。
在中央监控站上安装监控软件。
对系统进行配置和测试。
数据采集和监视系统运行后,Modbus 主站定期轮询 Modbus 从站并收集以下数据:实时发电量累计发电量系统电压系统电流环境温度错误代码这些数据通过通信网关传输到中央监控站,在那里显示在仪表板和图表上。
报警和通知如果检测到任何问题,例如系统故障或发电量下降,监控软件会发出警报并通过电子邮件或 SMS 通知相关人员。
这使操作员能够及时解决问题,最大限度地减少停机时间。
系统优势该 Modbus 通讯解决方案为光伏发电厂提供了以下优势:远程监视:允许操作员从任何地方远程监控系统。
实时数据:提供有关发电量、系统状态和环境条件的实时数据。
modbus协议通信实例
Modbus协议通信实例什么是Modbus协议?Modbus是一种常见的串行通信协议,用于在工业自动化领域中传输数据。
它最初由Modicon(现在的施耐德电气)公司于1979年开发,目的是在PLC(可编程逻辑控制器)和其他自动化设备之间进行通信。
Modbus协议采用简单的主从结构,其中一个设备作为主设备负责发送请求,其他设备则作为从设备响应请求。
通过Modbus协议,可以读取和写入数据寄存器、输入寄存器、线圈和离散输入等数据。
Modbus通信的基本概念寄存器(Registers)•数据寄存器:用于存储16位无符号整数值的寄存器。
•输入寄存器:类似于数据寄存器,但只能读取。
•线圈:用于存储布尔值(0或1)。
•离散输入:类似于线圈,但只能读取。
功能码(Function Codes)Modbus协议定义了一系列功能码,用于指定所需执行的操作类型。
常见的功能码包括:•读取数据寄存器:功能码03•写入单个线圈:功能码05•写入单个寄存器:功能码06•读取线圈:功能码01Modbus通信模式Modbus协议支持两种通信模式:RTU和ASCII。
RTU是最常用的模式,它使用二进制编码进行数据传输,并使用CRC(循环冗余校验)进行错误检测。
ASCII模式则使用可打印字符进行数据传输,并使用LRC(纵向冗余校验)进行错误检测。
Modbus协议通信实例为了更好地理解Modbus协议的应用,我们将通过一个简单的示例来说明如何使用Modbus协议进行通信。
假设我们有一个温度传感器连接到一个PLC,并且我们希望通过Modbus协议读取该传感器的温度值。
以下是一个基本的Modbus通信实例:1.首先,我们需要确定PLC的地址。
在Modbus协议中,每个设备都有一个唯一的地址,默认为1。
2.我们需要选择一个合适的串行通信接口,如RS485或RS232,并确保正确连接PLC和电脑。
3.在电脑上安装Modbus调试工具,如QModMaster或Simply Modbus。
三易modbus实例
三易modbus实例第一节:什么是Modbus协议Modbus是一种通信协议,用于在工业领域中的设备之间进行通信。
它是一个简单且易于实现的协议,被广泛应用于自动化控制系统中。
Modbus协议定义了一系列规则和格式,用于设备之间的数据传输和交换。
第二节:Modbus实例一:温度传感器考虑一个温度传感器的Modbus实例。
该传感器可以测量环境的温度,并将数据通过Modbus协议发送给控制系统。
控制系统可以使用Modbus协议读取传感器的温度数据,并根据需要采取相应的控制措施。
第三节:Modbus实例二:PLC控制器另一个常见的Modbus实例是PLC(可编程逻辑控制器)控制器。
PLC控制器用于控制和监控工业过程中的各种设备。
使用Modbus协议,PLC控制器可以与其他设备进行通信,例如传感器、执行器等。
通过Modbus协议,PLC控制器可以读取和写入其他设备的状态信息,实现对整个系统的控制。
第四节:Modbus实例三:能源管理系统第三个Modbus实例是能源管理系统。
能源管理系统用于监测和控制建筑中的能源消耗。
通过Modbus协议,能源管理系统可以与各种设备进行通信,例如电表、空调等。
能源管理系统可以使用Modbus协议读取设备的能耗数据,并根据需要采取相应的节能措施。
第五节:Modbus协议的特点和优势Modbus协议具有以下特点和优势:1. 简单易懂:Modbus协议的规则和格式简单明了,易于实现和理解。
2. 灵活可扩展:Modbus协议可以通过不同的物理层和传输层来实现,如串口、以太网等,具有很强的扩展性。
3. 高效可靠:Modbus协议使用二进制格式进行数据传输,传输效率高,且具有较高的可靠性。
4. 广泛应用:Modbus协议被广泛应用于工业自动化领域,适用于各种设备之间的通信和控制。
第六节:总结本文介绍了三个Modbus实例,分别是温度传感器、PLC控制器和能源管理系统。
这些实例展示了Modbus协议在工业自动化领域中的应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
----------------------- Page 1-----------------------#include<reg52.h>#include<absacc.h>#include<intrins.h>#include<ctype.h>/* These macro define simple data type 定义简单的数据类型*/#define uchar unsigned char#define ulint unsigned long#define uint unsigned int/* These macro for Mudbus function code :mudbus 功能码*/#define ReadCoilSta 0x01 // 0X read coil function 读线圈#define ForceSingleCoil 0x05 // 0X force single coil function 写线圈#define ReadHoldReg 0x03 // 4X read input register 读寄存器#define PresetMulReg 0x06 // 4X write multi register 写寄存器/* These macro describe index of communiction message from start to end */ #define CommIndexSlaveID 0 // macro for slave ID 站号#define CommIndexFunction 1 // macro for function code 的功能码#define CommIndexStartAdrHi 2 // macro for data hight adr 地址高位#define CommIndexStartAdrLo 3 // macro for data low adr 地址地位#define CommIndexNoPointHi 4 // macro for hight quantity datas 数据高位#define CommIndexNoPointLo 5 // macro for low quantity datas 数据低位/* These macro describe recieve message lenght of different function code *//* But not include data lenght ,the data is master write to slave *//* because we don't know the data lenght prior, it depend on ComBuf[ComIndexNoPoint] value */#define ReadCoilStaIndexEnd 7 // 0~7,0x01,0X#define ForceSingleCoilIndexEnd 7 // 0~7,0x05,0X#define ReadHoldRegIndexEnd 7 // 0~7,0x03,4X#define PresetMulRegIndexEnd 7 // 0~8,0x10,4X/* these macro describe send or recieve allowed */#define SEND 1 // send allowed 允许发送#define RECIEVE 0 // recieve allowed 允许接收#define SlaveID 0x01 // the slave's ID#define SendRecieveDelay 50 // Send turn to Recieve or Recieve turn to Send delay time vlaue 发送与接收转换时间#define MaxDataLen 30 // preset CommBuf array Max length 通讯缓冲区max 长度#define MaxRegLen 20 // preset SlaveOutputBuf Max lenght/* variable for modbus is following 变量定义*/bit data RecFinishF;uchar data CommIndex;uchar data writeadr;uchar data CommIndexEnd;uchar idata CommBuf[MaxDataLen];uchar idata SlaveOutputBuf[MaxRegLen]; // Hight 8 bit of word is front,Low 8 bit is back 高8 位在前低8 位在后uchar idata SlaveInputBuf[MaxRegLen];uchar data *port _at_ 0x7F ;/* exp data define *///#define SlaveAdr XBYTE [0xD800]sbit LED0=P1^0;sbit LED 1=P1^1;sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;/*后加的P0*/sbit LED00=P0^0;sbit LED01=P0^1;sbit LED02=P0^2;sbit LED03=P0^3;sbit LED04=P0^4;sbit LED05=P0^5;sbit LED06=P0^6;sbit LED07=P0^7;uchar idata ForceCoilBuf[10];uchar count=0;uchar forceval=0x00;//bit forcesendF=0;/* Table Of CRC Values for high-order byte CRC 校验高位*/uchar code auchCRCHi[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, ----------------------- Page 2-----------------------0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,0x40} ;/* Table of CRC values for low-order byte CRC 校验低位*/uchar code auchCRCLo[] = {0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD 1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB 1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,0x40} ;uint crc16(uchar *puchMsg,uchar usDataLen) // puchMsg message to calculate CRC upon{// usDataLen quantity of bytes in messageuchar uchCRCHi = 0xFF ; // high byte of CRC initialized 预设高校验值uchar uchCRCLo = 0xFF ; // low byte of CRC initialized 预设低校验值uint uIndex ; // will index into CRC lookup table 将index 在CRC 里查找while (usDataLen--) // Pass through message buffer 经过信息缓冲{uIndex = uchCRCHi ^ *puchMsg++ ; // calculate the CRC 计算CRCuchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;uchCRCLo = auchCRCLo[uIndex] ;}return (((uint)(uchCRCLo) << 8) | uchCRCHi) ;}/*------------- init code is following ----------------*/void initSFR(void)//初始化定时器、中断等{TH1=0xfa;TL1=0xfa; // botelv set 9600 bps/sTMOD=0x21; // T1 8bit timer for uart band rate, T0 16bit timerPCON=PCON | 0x80; // band rate is 2 timesSCON=0x50; // uart mode is 01,start bit + 8 bit data +stop bit : peer to peer communication PS=1; // uart intrrupt is hightestTR1=1; // start T1ES=1; // serially interrupt allowEA=1; // chief interrupt allow}void initvar(void){uchar i;for (i=0;i<=250;i++)_nop_();T0=RECIEVE;RecFinishF=0;CommIndex=0;CommIndexEnd=0xff; // First enlarge recieve lenghtfor (i=0;i<MaxRegLen;i++)SlaveOutputBuf[i]=0;}void init(void){initSFR();initvar();}----------------------- Page 3-----------------------void AnalyzeRecieve(void){uint crc16tem;uchar i;if (CommBuf[CommIndexSlaveID]==SlaveID) // The slave ID is matched 检查站号是否匹配{crc16tem=crc16(CommBuf,CommIndex-1); // calculate CRC check, erase two CRC byteif (crc16tem==(((uint)(CommBuf[CommIndexEnd]) << 8) | CommBuf[CommIndexEnd-1])) // crc16 check is OK检查校验是否正确{switch (CommBuf[CommIndexFunction]){case ReadCoilSta://--------------------------------------------------------------------------------读线圈CommBuf[CommIndexSlaveID]=SlaveID; // 001CommBuf[CommIndexFunction]=ReadCoilSta; // 101CommBuf[2]=CommBuf[CommIndexNoPointLo] / 0x08; // 0x16 bit10 转为10进制为16,/8 为2 个字节//for (i=0;i<MaxRegLen;i++) // sim inputval for testSlaveOutputBuf[0]=~P1; // send data of master force coil valSlaveOutputBuf[1]=~P0;i=CommBuf[2]+3;for(CommIndex=3;CommIndex<i;CommIndex++) // send data Reg to MasterCommBuf[CommIndex]=SlaveOutputBuf[CommIndex-3]; // hight 8 bit is first sendcrc16tem=crc16(CommBuf,CommIndex); // then send low 8 bit dataCommBuf[CommIndex++]=(uchar)(crc16tem & 0x00ff); // send crccheck low 8 bit is frontCommBuf[CommIndex]=(uchar)(crc16tem>>8); // then send hight 8 bitCommIndexEnd=CommIndex;CommIndex=0;SBUF=CommBuf[CommIndex++];break;case ForceSingleCoil://----------------------------------------------------------------------------------写线圈// SlaveInputBuf[0]=CommBuf[4]; // get data 0x00 or 0xffif (CommBuf[4]==0xff){switch(CommBuf[3]){case 0:LED0=0 ;break;case 1:LED1=0 ;break;case 2:LED2=0; ;break;case 3:LED3=0;break;case 4:LED4=0;break;case 5:LED5=0;break;case 6:LED6=0;break;case 7:LED7=0;break;case 8:LED00=0; break;case 9:LED01=0;break;case 10:LED02=0;break;case 11:LED03=0;----------------------- Page 4----------------------- break;case 12:LED04=0;break;case 13:LED05=0;break;case 14:LED06=0;break;case 15:LED07=0;break;}}else{switch(CommBuf[3]) {case 0:LED0=1;break;case 1:LED1=1;break;case 2:LED2=1;break;case 3:LED3=1;break;case 4:LED4=1;break;case 5:LED5=1;break;case 6:LED6=1;break;case 7:LED7=1;break;case 8:LED00=1; break;case 9:LED01=1;break;case 10:LED02=1;break;case 11:LED03=1;break;case 12:LED04=1;break;case 13:LED05=1;break;case 14:LED06=1;break;case 15:LED07=1;break;}}// LED0=!LED0;ForceCoilBuf[count]=CommBuf[4];forceval=CommBuf[4];count++;CommBuf[CommIndexSlaveID]=SlaveID; // 0 CommBuf[CommIndexFunction]=ForceSingleCoil; // 1 ----------------------- Page 5----------------------- CommIndex=2;// CommBuf[CommIndex++]=0x00;// CommBuf[CommIndex++]=0x01;// CommBuf[CommIndex++]=0x00;// CommBuf[CommIndex++]=0xff;// forcesendF=1;CommBuf[CommIndex++]=CommBuf[CommIndexStartAdrHi]; // 2CommBuf[CommIndex++]=CommBuf[CommIndexStartAdrLo]; // 3CommBuf[CommIndex++]=CommBuf[CommIndexNoPointHi]; // 4CommBuf[CommIndex++]=CommBuf[CommIndexNoPointLo]; // 5crc16tem=crc16(CommBuf,CommIndex); // then send low 8 bit dataCommBuf[CommIndex++]=(uchar)(crc16tem & 0x00ff); // send crccheck low 8 bit is front CommBuf[CommIndex]=(uchar)(crc16tem>>8); // then send hight 8 bit CommIndexEnd=CommIndex;CommIndex=0;SBUF=CommBuf[CommIndex++];break;case ReadHoldReg://---------------------------------------------------------------------------读积存器writeadr=CommBuf[3];CommBuf[CommIndexSlaveID]=SlaveID; // 0CommBuf[CommIndexFunction]=ReadHoldReg; // 1CommBuf[2]=CommBuf[CommIndexNoPointLo]*2; // 2 Byte Countport=(uchar data *)writeadr;for (i=0;i<CommBuf[2];i++) // sim inputval for test{SlaveOutputBuf[i]=0;i++;SlaveOutputBuf[i]=*port;port++;}i=CommBuf[2]+3;for(CommIndex=3;CommIndex<i;CommIndex++) // send data Reg to MasterCommBuf[CommIndex]=SlaveOutputBuf[CommIndex-3]; // hight 8 bit is first sendcrc16tem=crc16(CommBuf,CommIndex); // then send low 8 bit dataCommBuf[CommIndex++]=(uchar)(crc16tem & 0x00ff); // send crccheck low 8 bit is front CommBuf[CommIndex]=(uchar)(crc16tem>>8); // then send hight 8 bitCommIndexEnd=CommIndex;CommIndex=0;SBUF=CommBuf[CommIndex++];break;case PresetMulReg://----------------------------------------------------------------------------写积存器//writeadr=CommBuf[3]+CommBuf[2]*256;//j=CommBuf[CommIndexNoPointLo]*2;//for (i=0;i<j ;i++)//SlaveOutputBuf[i]=CommBuf[i+7]; // get data that master send start 7th byte//XBYTE[writeadr]=SlaveOutputBuf[i];///writeadr++;//}port=(uchar data *)CommBuf[3];*port=CommBuf[5];CommBuf[CommIndexSlaveID]=SlaveID; // 0CommBuf[CommIndexFunction]=PresetMulReg; // 1CommIndex=2;CommBuf[CommIndex++]=CommBuf[CommIndexStartAdrHi]; // 2CommBuf[CommIndex++]=CommBuf[CommIndexStartAdrLo]; // 3CommBuf[CommIndex++]=CommBuf[CommIndexNoPointHi]; // 4CommBuf[CommIndex++]=CommBuf[CommIndexNoPointLo]; // 5crc16tem=crc16(CommBuf,CommIndex); // then send low 8 bit dataCommBuf[CommIndex++]=(uchar)(crc16tem & 0x00ff); // send crccheck low 8 bit is front CommBuf[CommIndex]=(uchar)(crc16tem>>8); // then send hight 8 bit CommIndexEnd=CommIndex;CommIndex=0;SBUF=CommBuf[CommIndex++];//XBYTE[writeadr]=SlaveOutputBuf[1];default:for (i=0;i<=80;i++) // delay // error recieve again _nop_();CommIndex=0;T0=RECIEVE;break;----------------------- Page 6-----------------------}}else{for (i=0;i<=80;i++) // delay_nop_();CommIndex=0;T0=RECIEVE;}}}/*------------- intr code is following ----------------*/ void slavecomm(void) interrupt 4 using 2{uint i;ES=0;if(TI){TI=0;if (CommIndex<=CommIndexEnd){SBUF=CommBuf[CommIndex++];}else{// if (forcesendF)// _nop_();for (i=0;i<=SendRecieveDelay;i++) // delay _nop_();CommIndex=0;T0=RECIEVE;}}if(RI){RI=0;if (CommIndex<CommIndexEnd) // CommIndex less than recieve lenght {CommBuf[CommIndex]=SBUF;if (CommIndex==CommIndexFunction){switch (CommBuf[CommIndexFunction]){case ReadCoilSta:CommIndexEnd=ReadCoilStaIndexEnd;break;case ForceSingleCoil:CommIndexEnd=ForceSingleCoilIndexEnd;break;case ReadHoldReg:CommIndexEnd=ReadHoldRegIndexEnd;break;case PresetMulReg:CommIndexEnd=7 ;//6+CommBuf[CommIndexNoPointLo]*2+2; break;default:break;}}CommIndex++;}else // recieve finished CommIndex==CommIndexEnd{CommBuf[CommIndexEnd]=SBUF;RecFinishF=1;for (i=0;i<=SendRecieveDelay;i++) // delay_nop_();T0=SEND;}}ES=1;----------------------- Page 7-----------------------}/*------------------ main code following -----------------*/ 主函数void main(void){uint data i;init();while(1){// LED0=!LED0; for(i=0;i<=9;i++) _nop_();if (RecFinishF) { AnalyzeRecieve(); RecFinishF=0;}}}。