基于上海拜安光纤传感分析仪OSA搭建无线通信系统
0.前言
項目現(xiàn)場需要通過光纖測量應變,并需要遠程實時監(jiān)控。打算搭建一個無線通信系統(tǒng),基于上海拜安光纖傳感分析儀(OSA)。
購買了一套OSA,和上海正偉科技有限公司的4G傳輸模塊(MQ)。
1.本地搭建通信
1.1設備介紹
上海拜安光纖解調(diào)設備(OSA),F(xiàn)T310系列,有RJ45端口和RS232協(xié)議端口。
上海正偉無限發(fā)送設備(MQ),有RS232協(xié)議端口。
拜安提供了以TCP/IP協(xié)議通信的上位機,連上網(wǎng)線即可收發(fā)數(shù)據(jù)并顯示。
拜安也提供了以Modbus TCP協(xié)議通信的串口方式。
1.2ModBus TCP協(xié)議
TCP/IP協(xié)議可以使用RJ45端口實現(xiàn)通信。Modbus協(xié)議屬于應用層,可分為ASCII、RTU、TCP方式。
Modbus RTU一般通過RS485協(xié)議方式的9針COM端口傳輸,Modbus TCP一般通過TCP協(xié)議傳輸。
SIM傳輸一般通過DTU(Data transfer unit)協(xié)議傳輸。
freemodbus modbus TCP 學習筆記
1.3嘗試通信
解調(diào)設備與電腦通信-RJ45
使用網(wǎng)線連接,在上位機上選擇網(wǎng)卡設備,關閉防火墻。設備可以通信。
windows下用cmd命令netstat查看系統(tǒng)端口使用情況
解調(diào)設備與電腦通信-Modbus TCP
連接RS232協(xié)議的COM口,解調(diào)設備為公頭,實驗只連接了Rx與Tx兩個引腳。
連上設備,使用上位機,發(fā)現(xiàn)無法讀取數(shù)據(jù),上位機提示必須連接網(wǎng)絡,所以改用串口助手收發(fā)數(shù)據(jù)。
根據(jù)對方提供的Modbus TCP協(xié)議,使用串口助手輸入:
輸入: 00 00 00 00 00 06 01 00 00 01 00 04
返回各種數(shù)據(jù),不穩(wěn)定且感覺不正確。推出Modbus TCP方式需要連接設備RJ45端口才能通信。
而串口助手只能打開COM口才能通信,所以購買了RJ45轉COM口的轉接線。再次測試看看什么結果。
買回來發(fā)現(xiàn)并不能通信,TCP方式,需要直接用網(wǎng)線連接設備和電腦。
解調(diào)設備與電腦通信-Modbus RTU
有問對方要了RTU方式的通信指令,輸入:01 00 00 00 04 后面加上校驗碼后,發(fā)現(xiàn)設備返回的是與輸入指令一模一樣的字節(jié)碼。
感覺這個是不正確的,無法讀取傳感器的數(shù)值,故無法通信。(難道還需要把所有引腳都插上?)
Modbus TCP與RTU的區(qū)別
兩個協(xié)議的本質(zhì)都是MODBUS協(xié)議,都是靠MODBUS寄存器地址來交換數(shù)據(jù);
但所用的硬件接口不一樣,Modbus RTU一般采用串口RS232C或RS485/422,
而Modbus TCP一般采用以太網(wǎng)口。現(xiàn)在市場上有很多協(xié)議轉換器,可以輕松的將這些不同的協(xié)議相互轉換,比較有名的我用過的是研華(Advantech)的。
OS模型7層協(xié)議【http://www.cnblogs.com/skyofbitbit/p/3713125.html】
1.4成功通信
嘗試了多次后,發(fā)現(xiàn)串口助手無法使用TCP方式,故使用C#寫了關于ModBus TCP通信的上位機。
本質(zhì)上使用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中
//創(chuàng)建一個套接字
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;//增加定時發(fā)送需要將此功能打開
}
private void connect_Click_1(object sender, EventArgs e)
{
Connect();
}
還有一點需要注意的是,ModBus TCP通信服務不是設備提供的,而是設備自帶上位機軟件提供的。
所以需要打開OSA軟件,并開啟ModBus TCP服務。
2.無線通信
2.1上海正偉設備
正偉通信設備通過RS232串口與電腦通信,接收數(shù)據(jù)。
然后通過安裝在設備里的SIM,遠程發(fā)送數(shù)據(jù)到服務器。
服務器再分發(fā)到遠端連接服務的客戶機上。
所以從OSA設備的到數(shù)據(jù),再通過串口發(fā)送給正偉通信設備即可實現(xiàn)遠程數(shù)據(jù)傳輸。
2.2ModBus RTU通信
使用C#實現(xiàn),調(diào)用系統(tǒng)的SerialPort類,并設置好參數(shù),使用Open()方法打開設備。
//串口類
private SerialPort sp = new SerialPort();
//狀態(tài)
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; //是否可以發(fā)送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 + " 已經(jīng)打開了";
return false;
}
}
發(fā)送數(shù)據(jù)代碼,調(diào)用SerialPort類的WriteLine方法
public bool sendData2(string data)
{
if (sp.IsOpen)
{
//清空串口輸入輸出緩沖
sp.DiscardOutBuffer();
sp.DiscardInBuffer();
}
try
{
sp.WriteLine(data);
modbusStatus = string.Format("成功發(fā)送:{0}。", data);
return true;
}catch(Exception e)
{
modbusStatus = e.ToString();
return false;
}
}
總結
以上是生活随笔為你收集整理的基于上海拜安光纤传感分析仪OSA搭建无线通信系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【matlab】=size(img)的其
- 下一篇: 对38位互联网大佬奇葩癖好的奇葩解读