Modbus协议时应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络/串口和其它设备之间可以进行通信。它已经成为了一种工业标准。有了这个通信协议,不同的厂商生成的控制设备就可以连城工业网络,进行集中监控。
本文实现需要借用一个开源的NModbus库来完成,通过在菜单栏,工具-----NuGet包管理器-----管理解决方案的NuGet程序包,安装NModbus的开源库。
本次实例的基本框架和实现效果如下所示:
可自动识别当前设备的可用串口。
Modbus RTU通信的具体的实现如下:
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.ComponentModel;
5using System.Data;
6using System.Drawing;
7using System.Linq;
8using System.Text;
9using System.Threading.Tasks;
10using System.Windows.Forms;
11using Modbus.Device;
12using System.Net.Sockets;
13using System.Threading;
14using System.IO.Ports;
15using System.Drawing.Text;
16using System.Windows.Forms.VisualStyles;
17using System.Timers;
18using System.CodeDom.Compiler;
19 20namespace ModbusRtuMaster
21{
22publicpartialclass Form1 : Form
23 {
24#region 参数配置
25privatestatic IModbusMaster master;
26privatestatic SerialPort port;
27//写线圈或写寄存器数组 28privatebool[] coilsBuffer;
29privateushort[] registerBuffer;
30//功能码 31privatestring functionCode;
32//功能码序号 33privateint functionOder;
34//参数(分别为从站地址,起始地址,长度) 35privatebyte slaveAddress;
36privateushort startAddress;
37privateushort numberOfPoints;
38//串口参数 39privatestring portName;
40privateint baudRate;
41private Parity parity;
42privateint dataBits;
43private StopBits stopBits;
44//自动测试标志位 45privatebool AutoFlag = false;
46//获取当前时间 47private System.DateTime Current_time;
48 49//定时器初始化 50private System.Timers.Timer t = new System.Timers.Timer(1000);
51 52privateconstint WM_DEVICE_CHANGE = 0x219; //设备改变 53privateconstint DBT_DEVICEARRIVAL = 0x8000; //设备插入 54privateconstint DBT_DEVICE_REMOVE_COMPLETE = 0x8004; //设备移除 55 56#endregion 57 58 59public Form1()
60 {
61 InitializeComponent();
62 GetSerialLstTb1();
63 }
64 65privatevoid Form1_Load(object sender, EventArgs e)
66 {
67//界面初始化 68 cmb_portname.SelectedIndex = 0;
69 cmb_baud.SelectedIndex = 5;
70 cmb_parity.SelectedIndex = 2;
71 cmb_databBits.SelectedIndex = 1;
72 cmb_stopBits.SelectedIndex = 0;
73 74 }
75 76#region 定时器
77//定时器初始化,失能状态 78privatevoid init_Timer()
79 {
80 t.Elapsed += new System.Timers.ElapsedEventHandler(Execute);
81 t.AutoReset = true;//设置false定时器执行一次,设置true定时器一直执行 82 t.Enabled = false;//定时器使能true,失能false
83//(); 84 }
85 86privatevoid Execute(object source,System.Timers.ElapsedEventArgs e)
87 {
88//停止定时器后再打开定时器,避免重复打开 89 t.Stop();
90//ExecuteFunction();可添加执行操作 91 ();
92 }
93#endregion 94 95#region 串口配置
96///<summary> 97/// 串口参数获取
98///</summary> 99///<returns></返回串口配置参数>100private SerialPort InitSerialPortParameter()
101 {
102if (cmb_portname.SelectedIndex < 0 || cmb_baud.SelectedIndex < 0 || cmb_parity.SelectedIndex < 0 || cmb_databBits.SelectedIndex < 0 || cmb_stopBits.SelectedIndex < 0)
103 {
104 ("请选择串口参数");
105returnnull;
106