博图服务器怎么生成xdb文件,S7-1200作为modbusTCP服务器起始地址40001怎么更改-工业支持中心-西门子中国...

1、

指定 S7-1200 作为 modbusTCP 服务器保持寄存器,一般的作法是定义一个非优化的数据块,比如 DB3,在 DB3 定义一个字类型的数组,数组的数据类型为WORD,大小是 400 个WORD,然后保存编译这个数据块,编译完成后,数据块的中的存储空间是有偏移地址的;

MB_SERVER 服务器端指令的 MB_HOLD_REG 管脚处用指针形式指定服务器的保持寄存器区从这个数据块的那个偏移地址开始以及共有多少个字被定义成了保持区,比如 P#DB3.DBX0.0  WORD 400;

则定义了400个字的保持寄存器区,其中 40001 就是DB3.DBW0

则服务器端保持寄存器地址与 DB3 中定义的数组就有了对应关系。

40001 对应 DB3.DBW0

40002 对应 DB3.DBW2

40003 对应 DB3.DBW4

依此类推。不知道对保持区的说明说清楚了没有。

2、功能码是服务器响应帧的一部分,由主站请求帧决定,且是根据主站读写指令来自动生成的,程序无法去指定它。

3、PLC 系统在 MODBUS TCP 通讯过程中,数据帧是根据定义好管脚帧自动产生的,用户程序无法更改。

具体实现,上面的两位同行已给出了链接《Modbus TCP 通信》

http://www.ad.siemens.com.cn/productportal/Prods/S7-1200_PLC_EASY_PLUS/SmartSMS/024.html

回答者:

ed130624291815fd3fb249c3b9743edf.gif

大宝朱林森

回答时间:2019-12-18 17:06

1ead9b8c65e4493a66943e925e3c5988.png

大宝朱林森

-

超级顾问&nbsp&nbsp第15级

以下网友赞了您的问题:

黑猫警长W,大杰,cy77223,秀空,幸运吸铁石

填写您的评论...

提问者对于答案的评价:

讲的很清楚,非常感谢

暂无评论

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C# Modbus TCP 从机类编写示例: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace ModbusTcpSlave { class ModbusTcpSlave { private const int Port = 502; private TcpListener _listener; private TcpClient _client; private NetworkStream _stream; // Modbus address range private const int StartAddress = 0; private const int EndAddress = 100; // Modbus register values private readonly ushort[] _registers = new ushort[EndAddress - StartAddress + 1]; public ModbusTcpSlave() { _listener = new TcpListener(IPAddress.Any, Port); } public void Start() { _listener.Start(); Console.WriteLine("Modbus TCP slave started"); while (true) { Console.WriteLine("Waiting for client connection..."); _client = _listener.AcceptTcpClient(); Console.WriteLine("Client connected"); _stream = _client.GetStream(); while (_client.Connected) { // Read the Modbus TCP request var request = new byte[12]; _stream.Read(request, 0, request.Length); // Check if the request is a read or write request if (request[7] == 3) // Read request { var startAddress = (ushort)(request[8] << 8 | request[9]); var numRegisters = (ushort)(request[10] << 8 | request[11]); // Check if the requested address is within range if (startAddress >= StartAddress && startAddress + numRegisters <= EndAddress) { // Build the Modbus TCP response var response = new byte[9 + 2 * numRegisters]; response[0] = request[0]; response[1] = request[1]; response[2] = request[2]; response[3] = request[3]; response[4] = (byte)(5 + 2 * numRegisters); response[5] = request[5]; response[6] = request[6]; response[7] = request[7]; response[8] = (byte)(2 * numRegisters); // Fill in the register values for (var i = 0; i < numRegisters; i++) { var address = startAddress + i - StartAddress; var value = _registers[address]; response[9 + 2 * i] = (byte)(value >> 8); response[10 + 2 * i] = (byte)value; } // Send the response _stream.Write(response, 0, response.Length); } } else if (request[7] == 16) // Write request { var startAddress = (ushort)(request[8] << 8 | request[9]); var numRegisters = (ushort)(request[10] << 8 | request[11]); var numBytes = request[12]; // Check if the requested address is within range if (startAddress >= StartAddress && startAddress + numRegisters <= EndAddress) { // Write the register values for (var i = 0; i < numRegisters; i++) { var address = startAddress + i - StartAddress; var value = (ushort)(request[13 + 2 * i] << 8 | request[14 + 2 * i]); _registers[address] = value; } // Build the Modbus TCP response var response = new byte[12]; response[0] = request[0]; response[1] = request[1]; response[2] = request[2]; response[3] = request[3]; response[4] = 0; response[5] = 6; response[6] = request[6]; response[7] = request[7]; response[8] = request[8]; response[9] = request[9]; response[10] = request[10]; response[11] = request[11]; // Send the response _stream.Write(response, 0, response.Length); } } } } } public void Stop() { _listener.Stop(); Console.WriteLine("Modbus TCP slave stopped"); } } } ``` 该类可以创建一个 Modbus TCP 从机,并提供读写寄存器的功能。在示例中,Modbus 寄存器地址范围为 0 到 100,寄存器的值存储在 `_registers` 数组中。该类使用了 C# 的 TcpListener 和 TcpClient 类来监听和处理客户端请求,使用 NetworkStream 对象来进行数据传输。当有客户端连接时,该类会进入一个循环,不断监听客户端的请求并进行处理。如果请求是一个读取请求,则该类会根据请求的起始地址寄存器数量来读取寄存器的值,并将结果发送回客户端。如果请求是一个写入请求,则该类会根据请求的起始地址寄存器数量来写入寄存器的值,并向客户端发送确认响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值