很多自动化设备使用OMRON PLC来控制制造过程,如果有SCADA 数据系统需要获取PLC的数据,甚至控制制造过程的参数,如加热温度,切割长度等,这需要一个中间层来执行这个任务,这个类就是为这种需求而设计的。
可以把它嵌入到你的应用中,让你更专注上层的业务,不用为底层的过程而烦恼。
需要注意的是,这个类使用的是同步sockets和PLC通信,这会阻塞当前线程。最好是单独为通信过程开一个子线程。可以看到,这个类没有使用对话框或者控制台消息,多数函数都是返回bool类型的值,你可以使用LastError()函数随时检查结果。
当前版本实现了以下3种类型的 PLC通信:
[1,1] 内存区域读 finsMemoryAreaRead()
[1,2] 内存区域写 finsMemoryAreaWrite()
[5,1] 控制器数据读 finsConnectionDataRead()
DM 内存区域函数:
ReadDM()
ReadDMs()
WriteDM()
ClearDMs()
下图是按通道CH读取的数据寄存器DM100
CIO 位内存区域函数:
ReadCIOBit()
ReadCIOBit()
下图是按位读取的内部输入输出继电器CIO bit
下图是按位读取的内部辅助继电器WR bit
仔细阅读 tcpFINSCommand.cs 很容易就可以添加新的读取其他元件的函数 。
使用方法
1.首先把 Omron.vx.xx.dll 用引用添加到你的工程
2.添加一个OMRON.OmronPLC实例变量,用new OMRON.OmronPLC(OMRON.TransportType.Tcp)初始化并
指定传输类型为TCP;
public partial class TestPLC : Form
{
//
// plc class
//
OMRON.OmronPLC plc;
///
/// constructor
///
public TestPLC()
{
InitializeComponent();
// initielize a new plc object with tcp transport layer
//
this.plc = new OMRON.OmronPLC(OMRON.TransportType.Tcp);
}
...
3.在使用Connect()连接PLC之前,必须设置好tcp连接参数,IP,端口。因为OmronPlc 使用的是接口类
,须强制转换至tcpFINSCommand 类,然后调用SetTCPParams 函数。
///
/// 连接PLC
///
private void Connect()
{
if (ip.Text == "") return;
if (port.Text == "") return;
try
{
// set ip:port for command layer, may cast to tcpFINSCommand to set ip and port
//
OMRON.tcpFINSCommand tcpCommand = ((OMRON.tcpFINSCommand)plc.FinsCommand);
tcpCommand.SetTCPParams(IPAddress.Parse(ip.Text), Convert.ToInt32(port.Text));
// connection
//
if (! plc.Connect())
{
throw new Exception(plc.LastError);
}
...
4.调用读取,写入函数。
类默认使用Byte, UInt16 and UInt32, and arrays的引用传递参数。
///
/// 读取单个 DM
///
private void ReadDM()
{
if (dm_position.Text == "") return;
UInt16 dmval=0;
try
{
if (! plc.ReadDM(Convert.ToUInt16(dm_position.Text), ref dmval))
{
throw new Exception(plc.LastError);
}
dm_value.Text = dmval.ToString();
dialog.Text = plc.LastDialog("READ DM");
dialog.AppendText("DM VALUE: " + dmval.ToString());
}
catch (Exception ex)
{
MessageBox.Show("ReadDM() Error: " + ex.Message);
}
}
如果要使用调试功能,你可以在发送命令后调用 LastDialog() 函数,
这样,你就能获取PC和PLC之间的十六进制对话数据。