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

     

  • 相关阅读:
    基于java容器注解---基于泛型的自动装配
    mininet+floodlight搭建sdn环境并创建简单topo
    Bean装配之@Autowired注解
    Linux常用命令
    Bean利用Resource接口获取资源的几种方式
    MYSQL分页优化查询
    MYSQL统计和识别重复值
    MYSQL统计和识别重复值
    MYSQL处理数据重复值
    MYSQL处理数据重复值
  • 原文地址:https://www.cnblogs.com/hujun1992/p/OSA.html
Copyright © 2011-2022 走看看