在工控项目中,PLC一般必不可少,现场控制一般以它为核心,而PC系统一般只是起到远程监控、图表和数据存储的作用。除了PLC之间,PC和PLC之间通信外,一般一些智能显示模块(如型号各异的触摸屏 HMI系统)也和PLC通信,我们就要把把承载.NET MF的系统打造成一个最简单的HMI系统,远程操控PLC。
一般国外每一个PLC厂家,其通信协议一般都是不同的,如西门子PLC的PPI/MPI、欧姆龙 PLC的HostLink、AB PLC的DF1、施奈德 PLC的Modbus等等,由于Modbus协议简单、并且公开,所以国内一些PLC和智能模块大都是支持Modbus协议的,西门子200系列的PLC只要加载一个官方Modbus库,也是可以非常方便的支持Modbus协议。
在上一篇文章《PC通过Modbus协议远程操控开发板》,我们把Modbus Rtu client运行在PC端,这次我们把这部分程序移植到.Net Micro Framework系统上,让.Net Micro Framework开发板直接访问PLC。
有所不同的是,红牛开发的COM3直接支持RS485通信,这样我们和PLC直接用两个线相连就可以通信了,此外RS485是半双工通信,所以需要自己手动进行收发切换,除此之外和RS232通信代码基本一致。
不同之处的代码如下:
//发送数据
if (RS485)
{
RTS.Write(true);
}
serial.Write(bytSendData, 0, intSendNum);
if (RS485)
{
while (serial.BytesToWrite > 0) ;
RTS.Write(false);
}
具体的测试代码如下:
public static void Main()
{
Client mbclient = new Client();
mbclient.RS485 = true;
mbclient.RTS_Pin = (Cpu.Pin)GPIO_NAMES.PF11;
mbclient.Open("COM3", 19200, System.IO.Ports.Parity.None);
UInt16[] data=new UInt16[3];
Graphics.Clear(Color.Black);
Graphics.FillRectangle(0, 0, 239, 19, Color.White);
Graphics.DrawString(60, 3, "Modbus Rtu Test", Color.Blue);
byte QW0 = 0;
while (true)
{
if (++QW0 > 128) QW0 = 0;
mbclient.Write(1, 0, new UInt16[] { QW0 }, 1);
Thread.Sleep(300);
if(mbclient.Read(1,0,data,3) == 0)
{
Graphics.SuspendLayout();
Graphics.FillRectangle(0, 40, 239, 100, Color.Black);
Graphics.DrawString(20, 43, "QW0 : " + data[0].ToString(), Color.Yellow);
Graphics.DrawString(20, 63, "IW0 : " + data[1].ToString(), Color.LightGreen);
Graphics.DrawString(20, 83, "VW2 : " +data[2].ToString(), Color.Orange);
Graphics.ResumeLayout();
}
Thread.Sleep(300);
}
}