MB_DATA_PTRMB_DATA_PTR 参数是一个指针,指向待从 Modbus 服务器接收的数据或待发送到 Modbus服务器的数据所在的数据缓冲区。作为数据缓冲区,可使用全局数据块或存储区域 (M)。输入参数MB_MODE、MB_DATA_ADDR、MB_DATA_LEN 和 MB_DATA_PTR (S7-1200, S7-1500)说明 参数 MB_MODE、MB_DATA_ADDR 和 MB_DATA_LEN 的组合定义了当前 Modbus 消息中所使用的功能代码: • MB_MODE 中包含有关是否进行读写操作的信息。 读取:MB_MODE = 0、101、102、103 和104 写入:MB_MODE = 1、2、105、106、115 和 116(注意:MB_MODE = 2 时,Modbus 功能15 和 05 或 Modbus 功能 16 和 06 无区别。) • MB_DATA_ADDR中包含有关待读取/写入的目标信息,以及“MB_RED_CLIENT”指令用于 计算远程地址的地址信息。 • MB_DATA_LEN包含待读取/写入的值的数量。 下表显示了“MB_RED_CLIENT”指令的输入参数 MB_MODE、MB_DATA_ADDR、MB_DATA_LEN 与 Modbus 功能之间的关系。
读出 IDENT_CODE 按以下步骤读出IDENT_CODE: 1. 根据循环 OB 中的要求为 "MB_RED_CLIENT" 指令分配参数。将程序下载到 CPU 并设置为RUN。 2. 打开 Modbus 指令的背景数据块,单击“全部监视”(Monitor all) 按钮。 3.IDENT_CODE 输出将显示一个 18 位的字符串。4.使用复制/粘帖功能,从数据块中复制该字符串,并粘贴到产品订购后以电子邮件形式发送来 的表单中,该表单也包含在 CD 光盘中。 5.使用服务请求将表格发送至客户支持 。随后将收到 CPU 的注册密钥。 输入注册密钥 REG_KEY。 必须在每个"MB_RED_CLIENT" 指令中指定注册密钥 REG_KEY。应将 REG_KEY 保存在全局数 据块中,所有"MB_RED_CLIENT 指令均可通过该数据块接收所需的注册密钥。 请按如下步骤输入注册密钥 REG_KEY: •通过“添加新块...”(Add new block…) 插入具有唯一符号名的全新全局数据块,例如 “License_DB”。 •在该块中创建数据类型为 STRING[17] 的 REG_KEY 参数。 数据块中的 REG_KEY • 使用复制/粘贴将已传送的17 位注册密钥复制到“起始值”(Start value) 列。• 在循环 OB 中,在“MB_RED_CLIENT”指令的参数REG_KEY 中输入许可证数据块的名称和 字符串名称(例如 License_DB.REG_KEY)。 • 将修改后的块下载到CPU。可以在运行期间输入注册密钥;不需要进行 STOP -> RUN 的 更改。 现在,该 CPU 已获得使用"MB_RED_CLIENT 进行 Modbus/TCP 通信的授权,输出位 LICENSED 为 TRUE。 授权缺失或不正确如果输入的注册密钥错误或未输入任何内容,则 CPU 的 ERROR-LED 指示灯闪烁。在 S7-1200 和 S7-1500中,许可证缺失时会在诊断缓冲区中循环输入。仅 R 站和 H 站显示区 域长度错误。对于存储区域 (M) 中的缓冲区,可通过以下方式使用ANY 格式的指针:“P#位地址” “数据类 型” “长度”(例如:P#M1000.0 WORD 500)。 MB_DATA_PTR可引用不同的数据结构,具体取决于数据缓冲区所在的存储区域: • 使用具有优化访问权限的全局数据块时,MB_DATA_PTR可引用基本数据类型的变量或数 组。支持以下数据类型: 数据类型 长度(位) Bool 1 Byte、SInt、USInt、Char 8Word、Int、WChar、UInt 16 DWord、DInt、UDInt、Real 32 此时,可使用所有 Modbus功能支持的所有数据类型。例如,MB_RED_CLIENT 可将接收到的字节类型变量中的某个位写入一个特定地址内,而不改变该字节中的其它位。在执行位操作功能时,无需使用位数组。 •如果使用位存储器地址区或具有标准访问的全局数据块作为存储区,则 MB_DATA_PTR 对基本数据类型的使用无任何限制;此时,MB_DATA_PTR 还可引用诸如 PLC 数据类型 (UDT) 和系统数据类型 (SDT)等复杂数据类型。 说明 将位存储器地址区域用作数据缓冲区 如果将位存储器地址区域用作 MB_DATA_PTR数据缓冲区,则需注意该变量的值。 S7-1500(R/H) CPU 为 16 KB;S7-1200 CPU 为 8 KB。 输出参数STATUS_x、RED_ERR_S7、RED_ERR_DEV 和 TOT_COM_ERR (S7-1200, S7-1500) 参数STATUS_x(常规状态信息) 错误消息将显示在 "MB_RED_CLIENT" 指令的状态输出中。STATUS* (W#16#)说明 0AFF 连接未组态且未使用。必须组态 0A 连接。 7000未激活任何作业且未建立任何连接(REQ=0,DISCONNECT=1)。 7001 已触发连接建立操作。 7002中间调用。正在建立连接。 7003 正在终止连接。 7004 连接已建立且处于受监视状态。未激活任何作业处理。 7005正在发送数据。 7006 正在接收数据。 *在程序编辑器中,状态代码可显示为整数或十六进制值。有关切换显式格式的更多信息,请参见“另请参 见”。 参数STATUS_x(协议错误) STATUS* (W#16#) 说明 80C8 在指定时间段内,服务器无响应。检查与 Modbus服务器的连接。仅当尝试了所组态的可重复 尝试次数后,才报告该错误。如果“MB_RED_CLIENT”指令在指定时间内没有收到Zui初传输事务 ID(请参见静态变量MB_TRANSACTION_ID)的应答,则输出该错误代码。 8380 接收到的 Modbus 帧格式错误或字节数过少。 8382• 帧头中的 Modbus 帧长度与接收到的字节数不一致。 • 字节数目与实际传送的字节数不一致(仅功能 1 到 4)。 •收到的帧的起始地址与已经保存的起始地址不一致(功能 5、6、15、16)。 • 字数与实际传送的字数不一致(功能 15 和 16)。8383 读/写数据错误或访问了 MB_DATA_PTR (页 6317) 地址外的区域。 8384 •接收到无效的异常代码。 • 接收到的数据值与Zui初由客户端发送的不同(功能 5、6 和 8)。 • 接收到无效状态值(功能 11)8385 • 诊断代码不支持。 • 接收到的子功能代码与Zui初由客户端发送的不同(功能 8)。 8386接收到的功能代码与Zui初发送的代码不一致。 8387 服务器接收到的 Modbus TCP 帧协议 ID 不为“0”。STATUS*(W#16#) 说明 8388 Modbus 服务器发送的数据长度与所处理的不同。只有使用 Modbus 功能 5、6、15 或 16时, 才会发生该错误。 * 在程序编辑器中,状态代码可显示为整数或十六进制值。有关切换显式格式的更多信息,请参见“另请参 见”。 参数STATUS_x(参数错误) STATU S* (W#16 #) 说明 80B6 无效连接类型,仅支持 TCP 连接。 80BB 参数ActiveEstablished 的值无效。只允许对客户端建立主动连接 (ActiveEstablished = TRUE)。8188 参数 MB_MODE 的值无效。 8189 参数 MB_DATA_ADDR 中的数据地址无效。 818A 参数MB_DATA_LEN 中的数据长度无效。 818B 参数 MB_DATA_PTR 的指针无效。请检查 MB_DATA_ADDR(页 6317) 和 MB_DATA_LEN 参数的值。 818C 参数 BLOCKED_PROC_TIMEOUT 或RCV_TIMEOUT 超时(参见指令的静 态变量)。BLOCKED_PROC_TIMEOUT 和 RCV_TIMEOUT 必须介于0.5 s 和 55 s 之间。 8200 • 该端口当前正在处理另一个 Modbus 请求。 • MB_RED_CLIENT具有相同连接参数的另一实例正在处理现有 Modbus 请求。 * 在程序编辑器中,状态代码可显示为整数或十六进制值。有关切换显式格式的更多信息,请参见“另请参见”。说明 内部使用的通信指令的错误代码对于“MB_RED_CLIENT”指令,除了会发生表中列出的错误外,还会发生由该指令所使用的通信指令(“TCON”、“TDISCON”、“TSEND”、“TRCV”、“T_DIAG”和“TRESET”)所引起的错误。错误代码通过“MB_RED_CLIENT”指令的背景数据块来指定。相应指令的错误代码会显示在 "Static" 部分中的 STATUS下。 有关错误代码的含义,请参见相应通信指令文档。 说明 发送或接收数据时发生通信错误 如果发送或接收数据时发生通信错误(80C4(Temporary communications error. The specified connection istemporarily down.)、80C5 (Remote partner closed connectionactively.)、80A1 (The specified connection is disconnected or is notyet established.)),则 终止现有连接。 即,可查看连接终止时所有返回的 STATUS值,以及连接中止时仅输出造成连接终止原因的 STATUS 代码。 示例:如果接收数据时发生临时通信错误,则先输出 STATUS7003 (ERROR=false),再 输出 80C4 (ERROR=true)。