zoukankan      html  css  js  c++  java
  • 基于上海拜安光纤传感分析仪OSA搭建无线通信系统

    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)协议传输。

    freemodbus modbus TCP 学习笔记

     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的区别 

       两个协议的本质都是MODBUS协议,都是靠MODBUS寄存器地址来交换数据;
       但所用的硬件接口不一样,Modbus RTU一般采用串口RS232C或RS485/422,
       而Modbus TCP一般采用以太网口。现在市场上有很多协议转换器,可以轻松的将这些不同的协议相互转换,比较有名的我用过的是研华(Advantech)的。

    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;
                }
            }

     

  • 相关阅读:
    Study Plan The Twelfth Day
    Study Plan The Fifteenth Day
    Study Plan The Seventeenth Day
    Study Plan The Tenth Day
    Study Plan The Eighth Day
    Study Plan The Eleventh Day
    Study Plan The Sixteenth Day
    Study Plan The Thirteenth Day
    Study Plan The Fourteenth Day
    Study Plan The Ninth Day
  • 原文地址:https://www.cnblogs.com/hujun1992/p/OSA.html
Copyright © 2011-2022 走看看