2012-03-14 80 views
6

我尝试通过从PC(C#.NET)到PLC以太网模块(Omron)的UDP发送FINS命令,但没有收到来自PLC的任何响应,并且没有任何线索可以开始排查。发送FINS命令从C#到PLC

PLC具有非常简单的梯形逻辑如下: 如果DM100具有#0001值,然后在输出101.00触发。 (在这里,“触发”只是用于存储器区域D100一个符号名,“输出”是用于输出101.00一个符号) enter image description here

然后写一块C#执行的“存储区域写入” FINS命令其中命令码为01 02,后面跟着起始地址,要写入的项目数量和数据。 C#代码应将#0001的值写入PLC的D100区域以在101.00上触发ON。

[删除代码不起作用] ...

输出101.00没有被触发,我也收到任何异常。 我已经确定了以下内容:

  1. 通过“工作网”,在CX-Programmer中所确认的正确配置端口,节点和地址。我也ping每个IP,以确保节点连接。
  2. UdpClient代码是有效的,因为我写了一个非常简单的成功发送和接收数据包的服务器/客户端代码。
  3. 梯形图逻辑没有问题。我将梯形图传送到PLC并在监视模式下通过工作在线进行测试,并手动设置D100的数值。

我怀疑在fins_cmnd数组中有错误,但在我的代码中看到,我已经在每个值上注释了尽可能详细的内容;我不可能发现自己错过了任何东西。我怀疑我可能不会正确解析十六进制数,但是我再也没有例外可以指导我。

我不知道在哪里以及如何排除故障。希望有人在这里用FINS编程或PLC经验可以给我一些帮助。

【答案】
感谢Porge的链接 - 这让我发现了这个问题。经过一段时间后,终于可以开始工作了。请参阅下面的工作代码。

string SERV_IP_ADDR = "192.168.250.1"; 
const int FINS_UDP_PORT = 9600; 

byte[] sendPacket = new byte[] 
{ 
    // Full UDP packet: 80 00 02 00 00 00 00 05 00 19 01 02 82 00 64 00 00 01 00 01 

    // Header 
    0x80, //0.(ICF) Display frame information: 1000 0001 
    0x00, //1.(RSV) Reserved by system: (hex)00 
    0x02, //2.(GCT) Permissible number of gateways: (hex)02 
    0x00, //3.(DNA) Destination network address: (hex)00, local network 
    0x00, //4.(DA1) Destination node address: (hex)00, local PLC unit 
    0x00, //5.(DA2) Destination unit address: (hex)00, PLC 
    0x00, //6.(SNA) Source network address: (hex)00, local network 
    0x05, //7.(SA1) Source node address: (hex)05, PC's IP is 192.168.250.5 
    0x00, //8.(SA2) Source unit address: (hex)00, PC only has one ethernet 
    0x19, //9.(SID) Service ID: just give a random number 19 

    // Command 
    0x01, //10.(MRC) Main request code: 01, memory area write 
    0x02, //11.(SRC) Sub-request code: 02, memory area write 

    // PLC Memory Area 
    0x82, //12.Memory area code (1 byte): 82(DM) 

    // Address information 
    0x00, //13.Write start address (2 bytes): D100 
    0x64, 
    0x00, //15.Bit address (1 byte): Default 0 
    0x00, //16.No. of items (2 bytes): only one address which is D100 
    0x01, 

    // Write Data 
    0x00, //18.Data to write (2 bytes): value is 1 
    0x01, 
}; 

UdpClient client = new UdpClient(); //create a UdpClient instance 

try 
{ 
    client.Send(sendPacket, sendPacket.Length, SERV_IP_ADDR, FINS_UDP_PORT); 
} 
catch (SocketException se) 
{ 
    Console.WriteLine(se.ErrorCode + ": " + se.Message); 
} 

client.Close(); 

回答

6

这些字符串都不会被解析为十六进制。 NumberStyles.AllowHexSpecifier允许十六进制前缀“0x”,但不会将该数字解析为十六进制,除非它存在。所以你想要(char)Int16.Parse("0x64", NumberStyles.AllowHexSpecifier)

但是,C#中的数字文字可以是十六进制的,因此您可以代之以写出0x64而不是所有的文字。

我刚刚查看了协议的this page as a reference,并且最好直接创建消息作为字节,而不是指定Unicode代码点并将它们解码为ASCII字节。您也可以使用数组规范语法删除了很多混乱:

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, 
}; 

它也像有一些问题,你的数据段 - 根据链接的文档的内存地址应该是4个字节,写长度为2个字节,每个值为4个字节。这些与你所拥有的不匹配,所以我扩展了这一部分。

+0

内存是,是,4个字节,因此我有两个数组项目一个0x00和0x64一起4个字节。因为每个“部分”只需要16位。 – KMC 2012-03-14 04:41:42

+0

@KMC:我已经扩展了“数据”部分,这是基于我认为它是从给定页面看起来的样子。它有帮助吗? – porges 2012-03-14 04:50:47