问题标签 [plc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
16659 浏览

decimal - 为什么BCD = PLC中的十进制?

这个问题来自我之前的 SO question's 的表扬

我对 PLC 对 BCD 和十进制的解释感到困惑。在 PLC 文档中,它以某种方式暗示 BCD = 十进制:

在此处输入图像描述

指令读取 D300、0100 的内容为 BCD。参考Cyber​​ Slueth Omega 的回答在线 BCD-Hex 转换器,0100 (BCD) = 4 (Decimal) = 4 (Hex),但文档显示 0100 (BCD) = 100 (Decimal)。

为什么?

0 投票
1 回答
1883 浏览

logic - PLC中条件标志的正确使用

PLC 文档 (Omron) 显示了条件标志的正确和错误使用(见图)。但是我看不出两者之间有什么区别:如果指令 A 为 ON,那么指令 B 和未标记的指令都将被执行。两个梯形图对我来说都意味着实现同样的事情。为什么一个是错误的,另一个是正确的?

在此处输入图像描述

0 投票
1 回答
971 浏览

plc - PLC中的数学进位功能是什么?

“Carrey”在数学教学中做了什么?

以下面的例子为例:两个二进制文件的总和除了结果值之外还产生了一些额外的调用 CY。那么,1+ 2 = 3 + 一些进位?

文档只是说:“如果加法导致进位,则进位标志将变为 O”,但没有解释什么是进位,什么是进位标志。如果我执行带或不带进位的加法指令,它们有什么区别?

在此处输入图像描述

0 投票
1 回答
1208 浏览

language-agnostic - 如何将消息传送到 PLC

我对 PLC 没有任何经验,但是对于我将要做的下一个项目,我将不得不开发一个与 PLC 通信的应用程序。基本上,我会收到一个必须转发给 PLC 的 XML 消息。我不会开发 PLC 代码,但我想了解如何设计 PLC 数据结构(尽可能类似于 xml 模式)并将消息发送到 PLC。

尚未选择应用程序的编程语言,因此任何语言的示例都可以。

0 投票
1 回答
2513 浏览

simulation - PLC 上的 TCP/IP 以太网通信

我尝试通过以太网选件板将 Omron PLC (CP1L) 连接到 PC。我已正确设置连接,并且能够连接到 PLC 以配置其 IP 和各种设置。

然后我在让梯形图程序正确运行时遇到问题。

文档显示启用通讯时地址A202.00会打开,但是当我模拟梯形图程序时,地址A202.00总是打开。即使我断开以太网电缆,地址仍然打开。我不明白为什么即使没有连接 PLC 和 PC 的以太网电缆,地址仍然处于打开状态。

文件

模拟梯形图程序显示 A202.00 始终为 ON:

梯子截图

0 投票
1 回答
5361 浏览

plc - 使用梯形图程序将 TCP/IP 消息从 PLC 发送到 PC

考虑以下梯形图程序,该程序检查是否启用了连接 (A202.00),然后从 PLC 向 PC 发送消息。

梯形图程序

文档(Omron CX-Programmer)严重缺乏对程序约定的解释。我不明白的是:

  1. 将消息从节点发送到节点。我应该需要指定接收者 ID。似乎功能块没有可以插入 IP 地址的选项。我应该将MOVIP 地址转换为DM地址(D300)然后使用它吗?如果是这样的话(IP地址在4个字节之间有点..)?

  2. 有人可以解释什么是S第一个源词),D第一个目标词)和C第一个控制词)。它们不只是内存地址吗?例如,将内存地址的内容发送到另一个内存地址?


[编辑]

我想做什么?

我正在尝试将测量仪(由 PC/C# 应用程序通过以太网控制)连接到带有 Omron PLC 的机器人系统(没有 RS232 或串行,没有 TCP/IP,只有最简单的 I/O 点)。当仪表完成测量时,C# 应用程序向 Omron PLC 发送一个命令,根据收到的命令,打开或关闭一个输出,触发电压流向机器人的 I/O 端口。

我应该使用 FINS 吗?我需要知道 PLC 的哪些功能/协议才能做到这一点?我不知道,所以我正在测试文档中的每个功能。到目前为止,进展为零。

0 投票
2 回答
2346 浏览

tcp - PLC 控制器是否监听/发送自定义 TCP 数据包?

我希望能够与 PLC 控制器通信,以便我可以在 PLC 上发送和接收自定义命令。

我能够做到这一点的想法是在 PLC 上安装一个 TCP 侦听器,它可以读取特定端口上的 TCP 传入数据包,并根据数据包中的命令执行例程。它还可以通过 TCP/IP 发回信息。

这将允许我用多种语言编写软件,例如 C#、PHP、JavaScript 等,以便可以在任何平台上使用软件,例如 Windows、iOS、Android 等,向 PLC 发出命令。这也意味着您不需要 PLC 软件(可能很昂贵)来查看或控制 PLC。

我不是PLC程序员,所以我不知道PLC是否有发送和接收自定义TCP数据包的能力。我想知道a)如果可能的话b)这样做的可行性和c)我应该研究什么才能做到这一点。

谢谢。

0 投票
1 回答
15313 浏览

c# - 从 C# 向 PLC 发送 FINS 命令

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

PLC 有一个非常简单的梯形逻辑如下:如果DM100值为#0001,则触发输出101.00。(这里,“Trigger”只是内存区域的符号名D100,“Output”是输出的符号101.00在此处输入图像描述

然后我写了一段C#来执行“内存区域写入”的FINS命令,它的命令代码是01 02,后面是开始地址,要写入的项目数和数据。C# 代码应将 # 值写入0001PLC 的D100区域以在 上触发 ON 101.00

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

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

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

我怀疑数组中有错误fins_cmnd,但从我的代码中可以看出,我对每个值都做了尽可能详细的注释;我不可能发现自己缺少任何东西。我怀疑我可能没有正确解析十六进制,但同样,我没有例外来指导我。

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

[ANSWER]
感谢Porge的链接 - 这让我发现了问题。经过几条小径终于让它工作了。有关工作代码,请参见下文。

0 投票
2 回答
5573 浏览

c# - 挂在 Socket.Receive 上,无一例外

我有 WPF C# 应用程序,它使用 FINS 命令/帧通过以太网(UDP 数据包)与 PLC 通信(即写入/读取 Omron PLC 的内存地址)。

我可以成功地向WRITE PLC 地址发送命令,但是在READ命令期间尝试从 PLC 获取响应时应用程序挂起/崩溃。

要从 PC 发送到 PLC 的 FINS 数据包帧:

以下代码是我的 Socket 发送和接收:

我也尝试使用Try-Catch,但在应用程序挂起期间没有捕获到异常。我检查了eventvwr,上面写着:

来源: Application Hangs - "...stopped interacting with Windows and was closed" 详细信息(screenshot below)

在此处输入图像描述

0 投票
2 回答
2866 浏览

c# - 用 C# 编写解释器:实现指令的最佳方式?

我正在使用 C# 编写一个 PLC 语言解释器。该 PLC 语言包含 20 多种数据类型和 25 条左右的指令。一旦我开始生成代码,我就会平衡两种不同的方式来编写指令:

1) 每种指令都表示在一个类中,该类包含一个 bigswitch以便选择数据类型。例子:

2) 每个类代表具有单一数据类型的单一指令。这种方式避免了大的switch。例子:

我正在使用 COMMAND 设计模式 ( Exec()) 来编写指令。我认为第二个选择更好,因为避免了大开关,但该选择涉及编写超过 400 条指令。

请始终牢记,在这种情况下,执行性能比翻译性能更重要。

所以,我的确切问题如下:有没有其他方法来分解指令和数据类型?我正在寻找在不影响性能的情况下编写较少量的指令。

编辑:

这张图片显示了我的类型层次结构:

类型层次结构

这是 INT 类实现:

有些类更复杂(结构、数组、...)。

操作 Push 和 Pop 定义如下:

最后,在内存中进行读写操作。

我希望这些信息有所帮助。谢谢你。