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 = "\r\n"; //设置换行的时候
//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;
}
}
来源:oschina
链接:https://my.oschina.net/u/4411583/blog/4228710