Send FINS command from C# to PLC

后端 未结 1 1407
[愿得一人]
[愿得一人] 2021-02-04 19:53

I try to send FINS commands through UDP from PC (C#.NET) to PLC Ethernet module (Omron), but is not getting any responds from the PLC and have no clue where I c

1条回答
  •  盖世英雄少女心
    2021-02-04 19:56

    None of those strings will be parsed as hexadecimal. NumberStyles.AllowHexSpecifier allows the hexadecimal prefix "0x" but doesn't parse the number as hex unless it is present.

    So you'd want (char)Int16.Parse("0x64", NumberStyles.AllowHexSpecifier).

    However, numeric literals in C# can be hexadecimal, so instead of doing all that you can just write 0x64 instead.

    I've just looked at this page as a reference for the protocol, and it would also be better to create the message directly as bytes rather than specifying Unicode code points and decoding those to bytes as ASCII. You can also use the array specification syntax to remove a lot of clutter:

    var message = new byte[]
    {
        // header
        0x80, //(ICF) Display frame information: 1000 0001
        0x00, //(RSV) Reserved by system: (hex)00
        0x02, //(GCT) Permissible number of gateways: (hex)02
        0x00, //(DNA) Destination network address: (hex)00, local network
        0x00, //(DA1) Destination node address: (hex)00, local PLC unit
        0x00, //(DA2) Destination unit address: (hex)00, PLC
        0x00, //(SNA) Source network address: (hex)00, local network
        0x05, //(SA1) Source node address: (hex)05, PC's IP is 192.168.250.5
        0x00, //(SA2) Source unit address: (hex)00, PC only has one ethernet
        0x19, //(SID) Service ID: just give a random number 19
    
        // command
        0x01, //(MRC) Main request code: 01, memory area write
        0x02, //(SRC) Sub-request code: 02, memory area write
    
        // data
        0x82, //Memory area code, 2 bytes: 82(DM)
        0x00, //Write start address DM100
        0x64,
        0x00,
        0x00, //Word write: only one address
        0x01,
        0x00, //Write value of 1 to address DM100 (0000 0000 0000 0001)
        0x01, // - this value is 0xaabbccdd -> cc dd aa bb
        0x00, 
        0x00, 
    };
    

    It also looks like there are some problems with your data section - according to the linked document the memory address should be 4 bytes, the write length 2 bytes, and the values 4 bytes each. These don't match with what you have, so I've expanded that section.

    0 讨论(0)
提交回复
热议问题