从 C# 向 PLC 发送 FINS 命令

2023-12-24

我尝试发送FINS命令通过 UDP 从 PC (C#.NET) 发送到 PLC 以太网模块 (Omron),但没有从 PLC 得到任何响应,并且不知道从哪里可以开始故障排除。

PLC has a very simple ladder logic as follow: If DM100 has value of #0001, then trigger on output 101.00. (Here, "Trigger" is just a symbol name for memory area D100, and "Output" is a symbol for output 101.00) enter image description here

然后我写了一段C#,执行“内存区域写入”的FINS命令,其命令代码为01 02,后面是起始地址、要写入的项目数和数据。 C# 代码应写入值 #0001到PLC的D100触发 ON 的区域101.00.

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

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

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

我怀疑其中有错误fins_cmnd数组,但正如我的代码中所见,我对每个值都进行了尽可能详细的注释;我不可能发现自己错过了什么。我怀疑我可能没有正确解析十六进制,但同样,我也不例外地指导我。

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

[ANSWER]
Thanks 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();

这些字符串都不会被解析为十六进制。NumberStyles.AllowHexSpecifier allows十六进制前缀“0x”,但除非存在,否则不会将数字解析为十六进制。

所以你会想要(char)Int16.Parse("0x64", NumberStyles.AllowHexSpecifier).

但是,C# 中的数字文字可以是十六进制,因此您不必执行所有操作,只需编写0x64反而。

我刚刚看了此页面作为参考 http://deltamotion.com/support/webhelp/rmctools/Communications/Ethernet/Supported_Protocols/Ethernet_FINS_UDP.htm对于协议来说,最好直接将消息创建为字节,而不是指定 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 个字节。这些与您所拥有的不匹配,因此我扩展了该部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C# 向 PLC 发送 FINS 命令 的相关文章

随机推荐

  • Fetch API如何在catch中获取响应体?

    我从服务器得到这样的响应 Request URL http api bfexchange net wallet balance Request Method GET Status Code 504 Gateway Time out Remo
  • 将 HTML 从内容脚本注入到页面中

    我正在构建一个 Chrome 扩展程序 并且需要在几个网站之上覆盖一个 html 块 目前我正在使用 JQuery Get从我的服务器中提取 html 为了提高性能 我想知道是否可以将 html 作为文件包含在扩展目录中并直接从那里访问源代
  • scala 开发人员如何处理带有 shapeless 的 scala 代码中不正确的 IDE(Idea) 错误

    这是一个带有具体例子的一般性问题 人们如何进入 Scala 并将其用于大型项目来处理工具 IDE 的不可靠性 您是否只接受源代码中的红色标记 我遇到了另一个 scala 代码库 其中工作代码被 idea 标记为红色Cannot resolv
  • git推送到远程存储库“无法从远程存储库读取”

    我搜索了一段时间 但找不到解决我的问题的方法 我有一个服务器 我可以使用用户名通过 ssh 连接到git和本地 git 存储库 现在我想将我的本地存储库推送到服务器上新创建的存储库 这是我所做的 创建了一个 git 存储库 home git
  • 具有不同列表和不同 SelectedValue 的 WPF 绑定组合框

    在我的 UserControl ucStep2 中 我有 Step2InfoData 对象的 DataContext 该对象具有多个属性以及 private string rockDensUnit public string RockDen
  • Docker - 无法在现有文件上安装卷,文件已存在

    我正在尝试在 Docker 中为我的应用程序构建一个数据容器 我运行此命令来公开一些卷 docker run name svenv nl data v etc environment v etc ssl certs v var lib my
  • 按屏幕尺寸排列的 Android 资源文件夹

    我开发了一款Android游戏 支持市场上几乎所有的分辨率 240x320 320x480 480x800 480x854 600x1024 我的问题是 当我尝试支持平板电脑时 我不明白为什么 Android 将资源划分在不同的文件夹中 h
  • 转换泛型列表时显式转换运算符错误

    我正在创建一个显式转换运算符 以在实体类型的通用列表与模型类型的通用列表之间进行转换 有谁知道为什么我收到以下错误 用户定义的转换必须与封闭类型相互转换 我已经在 Entity objA 和 Model objA 之间有一个显式转换运算符
  • 无法在 android 10 中启动活动背景 [ android Q ]

    我使用 android 10 android Q galaxy 10 我用的是android studio 3 3 使用AVD 并制作了一个api 29 android 10 虚拟电话 在虚拟机上 我执行我的应用程序 然后启动其他应用程序
  • jQuery/iframe 在 Chrome 中不工作

    我在这里创建了一个 Facebook 粉丝页面 它包含 iframe 来调用某些使用 jquery 的页面 图像库 除了 Chrome 之外 所有浏览器都运行良好 Chrome 中的 iframe 中没有显示任何内容 只有空的白色背景 我尝
  • 爪哇。如何正确同步 getter 和 setter?

    如果我在一个对象中有多个可变属性 并且将由多个线程对其进行操作 那么我知道它们应该是同步的 class Doggie private String name private int age public void setName Strin
  • 如何访问 Django 模板中的用户配置文件?

    我使用存储一些额外的每用户信息AUTH PROFILE MODULE http docs djangoproject com en dev topics auth storing additional information about u
  • CodeIgniter 无法实例化控制器类

    所以我试图解决为什么 CodeIgniter 不会显示任何输出 除了 404 等 我检查了从 php apache 和 codeigniter 中的错误日志到模块重写的所有内容 一切似乎都配置得很好 我开始深入研究 CodeIgniter
  • 直到成功失败表达式检查多种类型的异常

    在Mule中 我在HTTP端点周围使用until success来捕获连接异常 超时 我捕获了 3 个不同的 Java 异常 java net ConnectException java net SocketTimeoutException
  • Java中按字段名称分组

    我正在尝试按 Java 对象的字段对它们进行分组 即人 java public class Person String name String surname 所以如果我有nPerson 反对 将所有名为 David 的人放入地图中的最简单
  • 用java编写C#委托

    我怎样才能在java版本中编写下面的代码 我读过类似的问题 但它们很令人困惑 他们回答说java没有像c 那样的委托功能 另一方面他们用java中的委托实现来回答 但没有什么与我的情况相似 我真的希望这个问题是清楚的 一周以来我一直被困住
  • 如何使用多个值设置 Amazon RDS SQL_MODE

    MySQL 允许在 my cnf 文件中将参数 SQL MODE 设置为多个值 如何在 Amazon RDS 上执行相同操作 更新 此问题已得到解决 见下文 MySQL 允许在 my cnf 文件中将参数 SQL MODE 设置为多个值 但
  • 如何正确推送 JSQMessagesViewController

    我有一个 Swift 项目 并尝试在其中使用 JSQMessagesViewController 我已经使用 cocoapods 来安装框架 并使用 swift import 语句导入它 import JSQMessagesViewCont
  • 如何从 C 中获取 ld 链接描述文件中定义的变量值

    我正在编写一个运行裸机的程序 我试图从自定义链接器脚本中获取一个变量以在 C 中使用 这是我尝试过的 From C extern unsigned long START OF PROG MEMORY volatile unsigned lo
  • 从 C# 向 PLC 发送 FINS 命令

    我尝试发送FINS命令通过 UDP 从 PC C NET 发送到 PLC 以太网模块 Omron 但没有从 PLC 得到任何响应 并且不知道从哪里可以开始故障排除 PLC has a very simple ladder logic as