简单介绍:
项目上需要与多家公司做接口对接。我们提供接口的有,其他公司提供的接口也有。所有的接口全部对接完了,遇到一个非常棘手的问题,需要获取甲方船厂设备上的状态,就给了一个文档,文档上写了IP、端口、协议、一些地址,没有API文档,拿到手上一面懵逼,这怎么玩儿。。。。
文档如下:
百度百科:
Modbus是一种串行
通信协议
,是Modicon公司(现在的
施耐德电气
Schneider Electric)于1979年为使用
可编程逻辑控制器
(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
看上去好像跟Socket差不多,本身又不是工业领域出身的,大概知道是一种工业领域通用的一套通信标准,下面直接上DEMO示例
第一步:下载类库
使用的类库已上传百度云盘:
链接:https://pan.baidu.com/s/1JtaGC0r17jjnQPMhkMKRJg
提取码:wagl
第二步:引入类库
第三步:引入命名空间
1 using HslCommunication.ModBus;
2 using HslCommunication;
第四步:初始化对象
1 初始化方式一、
2 private ModBusTcpClient busTcpClient = new ModBusTcpClient("192.168.1.195", 502, 0xFF); // ip、端口、站号(默认为0xFF)
4 初始化方式二、
5 private ModBusTcpClient busTcpClient = new ModBusTcpClient("192.168.1.195"); // 端口号502,站号0
第五步:开启连接
1 开启连接:
2 busTcpClient.ConnectServer();
4 关闭连接:
5 busTcpClient.ConnectClose( );
第六步:读写操作
1 private void userButton30_Click(object sender, EventArgs e)
3 // 读取操作
4 bool coil100 = busTcpClient.ReadCoil("100").Content; // 读取线圈100的通断
5 short short100 = busTcpClient.ReadInt16("100").Content; // 读取寄存器100的short值
6 ushort ushort100 = busTcpClient.ReadUInt16("100").Content; // 读取寄存器100的ushort值
7 int int100 = busTcpClient.ReadInt32("100").Content; // 读取寄存器100-101的int值
8 uint uint100 = busTcpClient.ReadUInt32("100").Content; // 读取寄存器100-101的uint值
9 float float100 = busTcpClient.ReadFloat("100").Content; // 读取寄存器100-101的float值
10 long long100 = busTcpClient.ReadInt64("100").Content; // 读取寄存器100-103的long值
11 ulong ulong100 = busTcpClient.ReadUInt64("100").Content; // 读取寄存器100-103的ulong值
12 double double100 = busTcpClient.ReadDouble("100").Content; // 读取寄存器100-103的double值
13 string str100 = busTcpClient.ReadString("100", 5).Content;// 读取100到104共10个字符的字符串
15 // 写入操作
16 busTcpClient.WriteCoil("100", true);// 写入线圈100为通
17 busTcpClient.Write("100", (short)12345);// 写入寄存器100为12345
18 busTcpClient.Write("100", (ushort)45678);// 写入寄存器100为45678
19 busTcpClient.Write("100", 123456789);// 写入寄存器100-101为123456789
20 busTcpClient.Write("100", (uint)123456778);// 写入寄存器100-101为123456778
21 busTcpClient.Write("100", 123.456);// 写入寄存器100-101为123.456
22 busTcpClient.Write("100", 12312312312414L);//写入寄存器100-103为一个大数据
23 busTcpClient.Write("100", 12634534534543656UL);// 写入寄存器100-103为一个大数据
24 busTcpClient.Write("100", 123.456d);// 写入寄存器100-103为一个双精度的数据
25 busTcpClient.Write("100", "K123456789");
项目界面:
完整代码(粗略写了DEMO,有不规范的地方,大佬莫怪):
1 using System;
2 using System.Windows.Forms;
3 using HslCommunication.ModBus;
4 using HslCommunication;
6 namespace ModbusDemo
8 public partial class Form1 : Form
10 public Form1()
11 {
12 InitializeComponent();
13 }
14 /// <summary>
15 /// 初始化类
16 /// </summary>
17 private ModbusTcpNet busTcpClient =null;
18 /// <summary>
19 /// 监听状态
20 /// </summary>
21 private bool IsEnable = false;
22 private void Form1_Load(object sender, EventArgs e)
23 {
24 txtPort.Text = "502";
25 txtIp.Text = "172.30.16.220";
26 textBox2.Text = "00141";
27 }
28 /// <summary>
29 /// 开启服务
30 /// </summary>
31 /// <param name="sender"></param>
32 /// <param name="e"></param>
33 private void Button5_Click(object sender, EventArgs e)
34 {
35 try
36 {
37 if (IsEnable)
38 {
39 MessageBox.Show("请勿重复建立连接!");
40 return;
41 }
42 string ip = txtIp.Text.Trim();
43 int port = Convert.ToInt32(txtPort.Text);
44 if (ip==null || ip=="")
45 {
46 MessageBox.Show("ip不能为空!");
47 return;
48 }
49 busTcpClient = new ModbusTcpNet(ip, port, 0x01);
50 OperateResult res = busTcpClient.ConnectServer();
51 if (res.IsSuccess==true) //接收状态返回值
52 {
53 IsEnable = true;
54 MessageBox.Show("开启连接成功");
55 }
56 else
57 {
58 MessageBox.Show("开启连接失败");
59 }
60 }
61 catch (Exception ex)
62 {
63 MessageBox.Show("开启连接失败!", ex.Message.ToString());
64 }
65 }
66 private void Button6_Click(object sender, EventArgs e)
67 {
68 try
69 {
70 if (!IsEnable)
71 {
72 MessageBox.Show("尚未建立连接!");
73 return;
74 }
75 busTcpClient.ConnectClose();
76 IsEnable = false;
77 MessageBox.Show("关闭连接成功!");
78 }
79 catch (Exception ex)
80 {
81 MessageBox.Show("关闭连接失败!", ex.Message.ToString());
82 }
83 }
85 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
86 {
87 Application.Exit();
88 }
90 private void Button3_Click(object sender, EventArgs e)
91 {
92 try
93 {
94 if (!IsEnable)
95 {
96 MessageBox.Show("尚未建立连接!");
97 return;
98 }
99 if (busTcpClient == null)
100 {
101 MessageBox.Show("尚未初始化对象!");
102 return;
103 }
104 string txt = textBox2.Text.Trim();
105 if (txt=="")
106 {
107 MessageBox.Show("地址不能为空!");
108 return;
109 }
110 bool coil100 = busTcpClient.ReadCoil(txt).Content; // 读取线圈100的通断
111 textBox1.Text = "";
112 MessageBox.Show("监听成功!");
113 textBox1.Text = coil100 == true ? "true" : "false";
114 }
115 catch (Exception ex)
116 {
117 MessageBox.Show(ex.Message.ToString());
118 }
119 }
120 }
121 }
链接:https://pan.baidu.com/s/1a3pnftQ2QAZFJcoKl9p_qQ
提取码:rhsl