|
西门子S7-1200 PLC通过TIA Portal编程环境中的Modbus TCP指令实现Modbus TCP/IP通信。主要指令包括 MB_SERVER (Modbus服务器)和MB_CLIENT (Modbus客户端)。1. MB_SERVER指令 MB_SERVER
指令使S7-1200 PLC作为Modbus TCP服务器(从站),被动接受来自Modbus客户端的请求,支持读/写保持寄存器、输入寄存器、线圈和离散输入。 输入参数参数数据类型描述DISCONNECTBool控制连接断开。0 :接受客户端连接;1 :断开连接。CONNECT_IDUInt连接ID,范围1-65535,需与客户端匹配。IP_PORTUInt通信端口,默认502 (Modbus TCP标准端口)。输出参数参数数据类型描述NDRBool新数据指示,客户端写入数据时置1 。DRBool数据读取指示,客户端读取数据时置1 。ERRORBool错误标志,通信错误时置1 。STATUSWord状态码,指示具体错误信息。数据块参数参数数据类型描述MB_HOLD_REGVariant指向保持寄存器的数据块(如DB2),存储客户端读/写数据。MB_COILVariant指向线圈数据块,存储布尔值。MB_INPUTVariant指向输入寄存器数据块(只读)。MB_DISCRETEVariant指向离散输入数据块(只读)。工作原理客户端发送Modbus功能码(如 03 读保持寄存器, 06 写单个寄存器)。 MB_SERVER
根据功能码处理请求,将数据存储到指定的数据块或从数据块读取数据。 支持的功能码: 01 (读线圈)、 02 (读离散输入)、 03 (读保持寄存器)、 04 (读输入寄存器)、 05 (写单个线圈)、 06 (写单个寄存器)、 15 (写多个线圈)、 16 (写多个寄存器)。 编程步骤创建数据块: 在TIA Portal中创建数据块(如DB2),用于保持寄存器。 禁用“优化块访问”以确保Modbus地址映射正确。 示例:DB2包含数组 ARRAY[0..99] OF Word ,对应Modbus地址40001-40100 。添加MB_SERVER: 在“Main [OB1]”中拖动 MB_SERVER 指令。配置参数: DISCONNECT :设为0 。IP_PORT :设为502 。MB_HOLD_REG :指向DB2。可选:配置 MB_COIL 、MB_INPUT 或MB_DISCRETE 。下载并测试: 下载程序到PLC。 使用Modbus客户端工具(如Modbus Poll)连接PLC的IP地址和端口,测试读/写操作。
注意事项 地址映射:Modbus地址 40001 对应数据块的 DBW0 ,确保数据类型匹配。 位顺序:S7-1200的位地址与Modbus标准可能不同,建议使用布尔数组。 连接限制:S7-1200支持有限的并发连接(通常为8个),视CPU型号而定。 2. MB_CLIENT指令 MB_CLIENT
指令使S7-1200 PLC作为Modbus TCP客户端(主站),主动向Modbus服务器发送读/写请求。 输入参数参数数据类型描述REQBool请求触发,上升沿触发通信。MB_MODEUSInt操作模式:0 (读)、1 (写)、2 (诊断)。IP_ADDRESSDWord服务器IP地址(如16#C0A80002 表示192.168.0.2 )。IP_PORTUInt服务器端口,默认502 。DATA_ADDRUIntModbus寄存器起始地址(如40001 )。DATA_LENUInt数据长度(寄存器数量,最大124)。DATA_PTRVariant指向存储读/写数据的数据块。输出参数参数数据类型描述DONEBool操作完成标志,成功时置1 。BUSYBool通信进行中,置1 。ERRORBool错误标志,通信失败时置1 。STATUSWord状态码,指示具体错误信息。工作原理MB_CLIENT
根据 MB_MODE 和 DATA_ADDR 生成Modbus请求,发送到服务器。 支持的功能码: 01 (读线圈)、 02 (读离散输入)、 03 (读保持寄存器)、 04 (读输入寄存器)、 05 (写单个线圈)、 06 (写单个寄存器)、 15 (写多个线圈)、 16 (写多个寄存器)。 数据存储在 DATA_PTR 指向的数据块中。 编程步骤创建数据块: 创建数据块(如DB3),用于存储读/写数据。 禁用“优化块访问”。 示例:DB3包含数组 ARRAY[0..49] OF Word ,用于存储50个寄存器数据。添加MB_CLIENT: 在“Main [OB1]”中拖动 MB_CLIENT 指令。配置参数: REQ :连接到触发信号(如M0.0 )。MB_MODE :设为0 (读)或1 (写)。IP_ADDRESS :输入服务器IP(如16#C0A80002 )。IP_PORT :设为502 。DATA_ADDR :输入寄存器地址(如40001 )。DATA_LEN :设置读取/写入的寄存器数量。DATA_PTR :指向DB3。控制逻辑: 使用定时器或条件触发 REQ ,避免连续触发。检查 DONE 、ERROR 和STATUS ,处理通信结果。下载并测试: 下载程序到PLC。 使用Modbus服务器工具(如Modbus Slave)模拟服务器,验证读/写操作。
注意事项 请求触发: REQ 需为上升沿触发,避免重复发送请求。 数据长度:一次请求最多读取124个寄存器,需分块处理大数据量。 错误处理:通过 STATUS 解析错误代码(如 16#8183 表示连接失败)。 超时:若服务器无响应,调整通信超时时间(在PLC属性中设置)。 3. 编程示例 示例1:S7-1200作为Modbus服务器 // 数据块 DB2:保持寄存器DATA_BLOCK "DB_Holding" { S7_Optimized_Access := 'FALSE' } VAR Registers : ARRAY[0..99] OF Word; END_VAREND_DATA_BLOCK// 在OB1中调用MB_SERVERNETWORK CALL "MB_SERVER" DISCONNECT := FALSE CONNECT_ID := 1 IP_PORT := 502 MB_HOLD_REG:= "DB_Holding" NDR => M0.0 DR => M0.1 ERROR => M0.2 STATUS => MW100
客户端可通过地址 40001-40100 读/写DB2的数据。
示例2:S7-1200作为Modbus客户端 // 数据块 DB3:读/写数据DATA_BLOCK "DB_Data" { S7_Optimized_Access := 'FALSE' } VAR Data : ARRAY[0..49] OF Word; END_VAREND_DATA_BLOCK// 在OB1中调用MB_CLIENTNETWORK CALL "MB_CLIENT" REQ := M0.0 MB_MODE := 0 // 读 IP_ADDRESS := 16#C0A80002 // 192.168.0.2 IP_PORT := 502 DATA_ADDR := 40001 DATA_LEN := 50 DATA_PTR := "DB_Data" DONE => M1.0 BUSY => M1.1 ERROR => M1.2 STATUS => MW200
读取服务器地址 192.168.0.2 的寄存器40001-40050 ,存储到DB3。 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |