C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议

很多自动化设备使用OMRON PLC来控制制造过程,如果有SCADA 数据系统需要获取PLC的数据,甚至控制制造过程的参数,如加热温度,切割长度等,这需要一个中间层来执行这个任务,这个类就是为这种需求而设计的。
可以把它嵌入到你的应用中,让你更专注上层的业务,不用为底层的过程而烦恼。


需要注意的是,这个类使用的是同步sockets和PLC通信,这会阻塞当前线程。最好是单独为通信过程开一个子线程。可以看到,这个类没有使用对话框或者控制台消息,多数函数都是返回bool类型的值,你可以使用LastError()函数随时检查结果。

C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议_第1张图片
当前版本实现了以下3种类型的 PLC通信:

 

    [1,1] 内存区域读 finsMemoryAreaRead()
    [1,2] 内存区域写 finsMemoryAreaWrite()
    [5,1] 控制器数据读 finsConnectionDataRead()

DM 内存区域函数:

    ReadDM()
    ReadDMs()
    WriteDM()
    ClearDMs()

下图是按通道CH读取的数据寄存器DM100

C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议_第2张图片

 

 CIO 位内存区域函数:

    ReadCIOBit()
    ReadCIOBit()

下图是按位读取的内部输入输出继电器CIO bit

C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议_第3张图片

 

下图是按位读取的内部辅助继电器WR bit

C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议_第4张图片

 

仔细阅读 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之间的十六进制对话数据。

你可能感兴趣的:(工控PLC,c#,tcp/ip)