基于上海拜安光纤传感分析仪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 = "\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;
            }
        }

 

 

posted on 2018-02-04 22:11  hujun1992  阅读(685)  评论(0编辑  收藏  举报

导航