0.前言
项目现场需要通过光纤测量应变,并需要远程实时监控。打算搭建一个无线通信系统,基于上海拜安光纤传感分析仪(OSA)。
购买了一套OSA,和上海正伟科技有限公司的4G传输模块(MQ)。
1.本地搭建通信
1.1设备介绍
上海拜安光纤解调设备(OSA),FT310系列,有RJ45端口和RS232协议端口。
上海正伟无限发送设备(MQ),有RS232协议端口。
拜安提供了以TCP/IP协议通信的上位机,连上网线即可收发数据并显示。
拜安也提供了以Modbus TCP协议通信的串口方式。
1.2ModBus TCP协议
TCP/IP协议可以使用RJ45端口实现通信。Modbus协议属于应用层,可分为ASCII、RTU、TCP方式。
Modbus RTU一般通过RS485协议方式的9针COM端口传输,Modbus TCP一般通过TCP协议传输。
SIM传输一般通过DTU(Data transfer unit)协议传输。
1.3尝试通信
- 解调设备与电脑通信-RJ45
使用网线连接,在上位机上选择网卡设备,关闭防火墙。设备可以通信。
windows下用cmd命令netstat查看系统端口使用情况
- 解调设备与电脑通信-Modbus TCP
连接RS232协议的COM口,解调设备为公头,实验只连接了Rx与Tx两个引脚。
连上设备,使用上位机,发现无法读取数据,上位机提示必须连接网络,所以改用串口助手收发数据。
根据对方提供的Modbus TCP协议,使用串口助手输入:
输入: 00 00 00 00 00 06 01 00 00 01 00 04
返回各种数据,不稳定且感觉不正确。推出Modbus TCP方式需要连接设备RJ45端口才能通信。
而串口助手只能打开COM口才能通信,所以购买了RJ45转COM口的转接线。再次测试看看什么结果。
买回来发现并不能通信,TCP方式,需要直接用网线连接设备和电脑。
- 解调设备与电脑通信-Modbus RTU
有问对方要了RTU方式的通信指令,输入:01 00 00 00 04 后面加上校验码后,发现设备返回的是与输入指令一模一样的字节码。
感觉这个是不正确的,无法读取传感器的数值,故无法通信。(难道还需要把所有引脚都插上?)
Modbus TCP与RTU的区别
1.4成功通信
尝试了多次后,发现串口助手无法使用TCP方式,故使用C#写了关于ModBus TCP通信的上位机。
本质上使用Socket编程,找到IP地址和端口号,然后建立Socket连接。
初识Modbus TCP/IP——C#编写Modbus TCP客户端程序
public Socket newclient; public bool Connected; public Thread myThread; public delegate void MyInvoke(string str); public Form1() { InitializeComponent(); } private void exit_Click(object sender, EventArgs e) { Application.Exit(); } public void Connect() { byte[] data = new byte[1024]; string ipadd = serverIP.Text.Trim();//将服务器IP地址存放在字符串 ipadd中 int port = Convert.ToInt32(serverPort.Text.Trim());//将端口号强制为32位整型,存放在port中 //创建一个套接字 IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ipadd), port); newclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //将套接字与远程服务器地址相连 try { newclient.Connect(ie); connect.Enabled = false;//使连接按钮变成虚的,无法点击 Connected = true; } catch (SocketException e) { MessageBox.Show("连接服务器失败 " + e.Message); return; } ThreadStart myThreaddelegate = new ThreadStart(ReceiveMsg); myThread = new Thread(myThreaddelegate); myThread.Start(); tmSend.Enabled = true;//增加定时发送需要将此功能打开 } private void connect_Click_1(object sender, EventArgs e) { Connect(); }
还有一点需要注意的是,ModBus TCP通信服务不是设备提供的,而是设备自带上位机软件提供的。
所以需要打开OSA软件,并开启ModBus TCP服务。
2.无线通信
2.1上海正伟设备
正伟通信设备通过RS232串口与电脑通信,接收数据。
然后通过安装在设备里的SIM,远程发送数据到服务器。
服务器再分发到远端连接服务的客户机上。
所以从OSA设备的到数据,再通过串口发送给正伟通信设备即可实现远程数据传输。
2.2ModBus RTU通信
使用C#实现,调用系统的SerialPort类,并设置好参数,使用Open()方法打开设备。
//串口类 private SerialPort sp = new SerialPort(); //状态 public string modbusStatus; public string[] portsName; public string receiveData; public float[] temperatrueData; public ModBus() { } //构造方法 public ModBus(bool getNames) { portsName = SerialPort.GetPortNames(); Array.Sort(portsName); } //析构方法 ~ModBus() { } //打开串口 public bool Open(string portName, int baudRate, int databits, Parity parity, StopBits stopbits) { if (!sp.IsOpen) { sp.PortName = portName; sp.BaudRate = baudRate; sp.DataBits = databits; sp.Parity = parity; sp.StopBits = stopbits; sp.ReadTimeout = 1000; sp.WriteTimeout = 1000; sp.NewLine = " "; //设置换行的时候 //sp.RtsEnable = true; //是否可以发送rts信号 sp.Handshake = Handshake.None; sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(myWriteDataReceive); try { sp.Open(); } catch (Exception err) { modbusStatus = "无法打开端口" + portName + ": " + err.Message; return false; } modbusStatus = portName + " 端口打开连接成功"; return true; } else { modbusStatus = portName + " 已经打开了"; return false; } }
发送数据代码,调用SerialPort类的WriteLine方法
public bool sendData2(string data) { if (sp.IsOpen) { //清空串口输入输出缓冲 sp.DiscardOutBuffer(); sp.DiscardInBuffer(); } try { sp.WriteLine(data); modbusStatus = string.Format("成功发送:{0}。", data); return true; }catch(Exception e) { modbusStatus = e.ToString(); return false; } }