当前位置: 首页 > news >正文

C#使用EasyModbus进行通讯的实现示例

EasyModbus是一个流行的.NET库用于实现Modbus TCP、RTU和UDP协议通信。一 安装EasyModbus二 ModbusRTU-串口连接1234567// 创建Modbus RTU客户端ModbusClient modbusClient newModbusClient(COM10);// 串口号modbusClient.Baudrate 9600;// 波特率modbusClient.Parity System.IO.Ports.Parity.None;// 校验位modbusClient.StopBits System.IO.Ports.StopBits.One;// 停止位modbusClient.Connect();三 ModbusTCP-网口连接1234// 创建Modbus客户端实例ModbusClient modbusClient newModbusClient(127.0.0.1, 502);// IP地址和端口// 连接到Modbus服务器modbusClient.Connect();四 读取多个输出线圈12// 读取线圈状态 (功能码01)bool[] coilStatus modbusClient.ReadCoils(0, 5);// 从地址0开始读取5个线圈五 写入单个线圈12// 写入单个线圈 (功能码05)modbusClient.WriteSingleCoil(0,true);// 向地址0写入true六 读取保持寄存器12// 读取保持寄存器 (功能码03)int[] holdingRegisters modbusClient.ReadHoldingRegisters(0, 10);// 从地址0开始读取10个寄存器七 读取输入寄存器1int[] inputRegisters modbusClient.ReadInputRegisters(0, 5);八 写入单个输出寄存器1modbusClient.WriteSingleRegister(0, 1234);九 写入多个输出寄存器123// 写入多个寄存器 (功能码16)int[] valuesToWrite { 100, 200, 300 };modbusClient.WriteMultipleRegisters(0, valuesToWrite);// 从地址0开始写入基本用法1. Modbus TCP客户端1234567891011121314151617181920212223242526272829303132333435usingEasyModbus;// 创建Modbus客户端实例ModbusClient modbusClient newModbusClient(127.0.0.1, 502);// IP地址和端口try{// 连接到Modbus服务器modbusClient.Connect();// 读取保持寄存器 (功能码03)int[] holdingRegisters modbusClient.ReadHoldingRegisters(0, 10);// 从地址0开始读取10个寄存器// 写入单个寄存器 (功能码06)modbusClient.WriteSingleRegister(0, 1234);// 向地址0写入值1234// 写入多个寄存器 (功能码16)int[] valuesToWrite { 100, 200, 300 };modbusClient.WriteMultipleRegisters(10, valuesToWrite);// 从地址10开始写入// 读取线圈状态 (功能码01)bool[] coilStatus modbusClient.ReadCoils(0, 5);// 从地址0开始读取5个线圈// 写入单个线圈 (功能码05)modbusClient.WriteSingleCoil(0,true);// 向地址0写入true}catch(Exception ex){Console.WriteLine($发生错误: {ex.Message});}finally{// 断开连接modbusClient.Disconnect();}2. Modbus RTU客户端 (串口通信)123456789101112131415161718192021222324usingEasyModbus;// 创建Modbus RTU客户端ModbusClient modbusClient newModbusClient(COM1);// 串口号modbusClient.Baudrate 9600;// 波特率modbusClient.Parity System.IO.Ports.Parity.None;// 校验位modbusClient.StopBits System.IO.Ports.StopBits.One;// 停止位try{modbusClient.Connect();// 与TCP类似的操作int[] inputRegisters modbusClient.ReadInputRegisters(0, 5);// ...其他操作}catch(Exception ex){Console.WriteLine($发生错误: {ex.Message});}finally{modbusClient.Disconnect();}3. Modbus服务器EasyModbus也支持创建Modbus服务器123456789101112131415161718usingEasyModbus;// 创建Modbus TCP服务器ModbusServer modbusServer newModbusServer();modbusServer.Port 502;// 设置端口// 设置寄存器值服务器模拟modbusServer.HoldingRegisters[0] 100;modbusServer.HoldingRegisters[1] 200;// 启动服务器modbusServer.Listen();Console.WriteLine(Modbus服务器已启动按任意键停止...);Console.ReadKey();// 停止服务器modbusServer.StopListening();高级功能异步操作12// 异步读取保持寄存器int[] registers await Task.Run(() modbusClient.ReadHoldingRegisters(0, 10));事件处理1234modbusClient.DataReceived (sender, e) {Console.WriteLine($接收到数据: {BitConverter.ToString(e.Data)});};超时设置1modbusClient.ConnectionTimeout 5000;// 5秒连接超时注意事项确保防火墙允许Modbus通信默认端口502对于RTU模式确保串口配置与设备匹配处理异常情况如连接失败、超时等寄存器地址从0开始但某些设备文档可能从1开始计数需要注意偏移完整示例1234567891011121314151617181920212223242526272829303132333435363738394041usingSystem;usingEasyModbus;classProgram{staticvoidMain(string[] args){ModbusClient modbusClient newModbusClient(192.168.1.100, 502);try{Console.WriteLine(正在连接Modbus服务器...);modbusClient.Connect();// 读取保持寄存器Console.WriteLine(读取保持寄存器...);int[] registers modbusClient.ReadHoldingRegisters(0, 5);for(inti 0; i registers.Length; i){Console.WriteLine($寄存器 {i}: {registers[i]});}// 写入寄存器Console.WriteLine(写入寄存器...);modbusClient.WriteSingleRegister(10, 1234);// 验证写入intvalue modbusClient.ReadHoldingRegisters(10, 1)[0];Console.WriteLine($寄存器10的新值: {value});}catch(Exception ex){Console.WriteLine($错误: {ex.Message});}finally{modbusClient.Disconnect();Console.WriteLine(连接已关闭);}}}复制讲解通过以上示例你应该能够开始在C#项目中使用EasyModbus库进行Modbus通信了。
http://www.rkmt.cn/news/1364089.html

相关文章:

  • 企业级AI写作Agent部署全链路(从POC到规模化上线):金融、电商、教育三大垂直领域实测数据首度公开
  • 网络理论与机器学习融合:构建材料发现的数据驱动导航系统
  • 相对噪声模型下梯度下降的收敛性分析与实践指南
  • 保姆级教程:用YOLACT训练自己的数据集(从数据标注到模型推理,含完整Python源码)
  • Cliff Walking环境实战:用Python手把手教你实现Sarsa和Q-Learning(附完整代码)
  • FPGA神经网络加速实战:SNL与hls4ml框架的流式与并行架构深度对比
  • 图模型学习算法解析:迭代缩放、伪似然与评分匹配的工程实践
  • 量子机器学习安全威胁:NISQ时代的数据投毒攻击与防御挑战
  • 3D层析SAR与AutoML融合:实现高精度森林树种自动识别
  • 8051多端口I2C驱动设计:函数指针与结构体封装方案
  • 非结构化网格数据处理:从传统插值到GNN与PINNs的AI求解器演进
  • 别再只用Apriori了!用Python的mlxtend库5分钟搞定FP-Growth关联规则挖掘
  • Kylin Linux开机动画替换踩坑记:权限、路径与update-initramfs详解
  • 混合机器学习模型在物联网入侵检测中的实战应用
  • 别光调包了!手把手带你用Python从零实现Apriori算法,搞懂关联规则挖掘
  • 量子神经网络实战:突破贫瘠高原的梯度消失与泛化挑战
  • 个性化机器学习评估:预测精度与解释质量为何会背离?
  • 集合卡尔曼滤波结合机器学习代理模型的长期精度理论分析与实践
  • 多重样本分割:提升异质性处理效应估计稳定性的关键技术
  • 破解特征相关性难题:MVIM与CVIM如何提供更稳健的变量重要性评估
  • 变分量子编译:用乘积态训练实现高效量子动力学模拟
  • [智能体-27]:Ollama 通过命令行与模型交互的几种方式
  • FPGA加速DNN:LUT方案的优势与实践
  • 8051单片机硬件栈优化与固定位置配置指南
  • GE 和 Runtime:不是上下游,是协同决策
  • 软体机器人跳跃:离散弹性杆仿真与动态分岔原理详解
  • 多任务学习优化文档级机器翻译:源语句重建与上下文重建策略对比
  • 华为防火墙双ISP出口服务器发布避坑指南
  • 课题框架设计:递归自指系统的伦理曲率约束(世毫九实验室原创课题)
  • ICE-T框架:破解机器学习教学黑箱,培养计算与解释性思维