问题标签 [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 投票
1 回答
461 浏览

python - UDP套接字接收数据失败

我有一个问题:我创建了一个小的 Python 脚本来从 LAN 上的 Omron PLC 内存中读取数据。Delphi 程序运行批处理文件,定期(每 6 秒)运行 Python 脚本。

该脚本在 2 台 Win 7 PC 和 1 台 Win XP PC 上运行。

我的问题是:Win XP PC和PLC之间没有数据传输一段随机时间(大约1分钟,有时更多),但Win 7 PC与同一个PLC通信没有问题。

我使用UDP协议。

LAN 似乎“睡着了”。这是日志文件:(08:41:13 -> 08:42:30。预期 08:41:13 -> 08:41:19, 08:41:25, 08:41:31, ...)

可能是什么问题呢?

0 投票
2 回答
1050 浏览

c++ - 二进制 PLC 通信的校验和

我一直在摸索计算校验和以使用二进制命令与 Unitronics PLC 通信。他们提供了源代码,但它是一个仅限 Windows 的 C# 实现,除了基本语法之外,这对我没什么帮助。

规范 PDF(校验和计算接近尾声)

C#驱动源码(Utils.cs中的校验和计算)

预期结果

下面是字节索引、消息描述和有效的示例。

规范要求计算 22 字节消息头的累积值,以及单独的 6+ 字节详细信息,得到 sum 模 65536 的值,然后返回该值的二进制补码。

尝试#1

我的理解是 Python 中的波浪号 (~) 运算符直接源自 C/C++。在编写了创建消息的 Python 一天后,我想出了这个(精简版):

信息:2F5F4F504C4300FE010000004D000000000001000600600L010001FF010001005C

我在那里看到了一个 L,这与昨天的结果不同,而且没有更接近。如果您想要基于消息的其余部分的快速公式结果:Checksum(Header) 应该返回 F1FC 并且 Checksum(Details) 应该返回 FEFE

它返回的值与规范中的示例相差甚远。我认为问题可能是一两件事:Checksum 方法没有正确计算十六进制字符串的总和,或者 Python~运算符不等同于 C++~运算符。

尝试#2

一个朋友给了我他对计算应该是什么的 C++ 解释,我只是无法理解这段代码,我的 C++ 知识很少。

0 投票
5 回答
2472 浏览

networking - LabView Client VI 通过网络 (LAN) 与 WinCC OPC Server 通信时出错

我正在尝试使用 Siemens PLC 使某些系统自动化;为此,我们开发了用于控制和监视的 WinCC Flexible RT 应用程序,并将基于 PC 的 HMI 面板声明为 OPC 服务器。哪个工作正常。

现在,当我尝试在同一台 PC 上的 WinCC 或 Labview 中创建 OPC 客户端应用程序时,我能够访问客户端上服务器的所有标签,我能够这样做。

当我尝试在通过局域网连接的其他计算机上创建客户端应用程序时[完美且配置良好的网络工作],在这种情况下我无法访问 OPC 服务器/标签。

在这种情况下可以做些什么。?

0 投票
5 回答
23194 浏览

floating-point - PLC 结构化文本,将十进制转换为实数(浮点数)。没有得到我期望的价值。(IEEE-754)

我有一个通过 Profibus DP 与 PLC 通信的硬件,它向我发送 4 个十六进制字节的数据,即“44 79 FF FF”,并且在 PLC 程序中,我为此输入数据声明了一个 BYTE 数组。问题是在 PLC 中,我在 BYTE 数组中收到的数据是“66 121 255 255”,这是十六进制的十进制值,但我的目标是将该值转换为 REAL,当我这样做时,我不是得到我期望的价值。

我创建了一个 DWORD( 4bytesData),我将所有 BYTES 插入其中。所以在我将 4 个字节插入4bytesData字节之前是:in1 = 68, in2 = 121, in3 = 255&in4 = 255

其中 in1、in2、in3 和 in4 是字节 0-3。

我得到的价值是;4bytesData= 1148846079 & realValue= 1.148846e+009

我期望从中获得的价值realValue是= 9.9999993896484375E2

如果我使用这个网站( IEEE754 Analyzer/Converter)并转换十六进制值(4479FFFF),我得到我想要的值,如果我插入十进制值(1148846079),我得到的值与我在可编程逻辑控制器。

我希望你能理解我的问题,非常感谢提前。

0 投票
3 回答
1321 浏览

javascript - 我有十进制数,需要转换为二进制数并有一个复选框链接到该二进制数的每一位

这很难解释,但我会尽力而为。

我正在使用带有网络服务器的 PLC 和一些我编写的 JavaScript 代码,用于将 PLC 寄存器中的值写入您的网页。

PLC 具有的功能之一是时间表(例如,您可以选择灯必须亮起的日期和时间)。为了设置时间表,我为时间创建了一些输入框,并为一周中的每一天创建了 7 个复选框。您必须将十进制值发送给控制器,这对于小时和分钟来说没有问题。

但是,工作日用二进制数表示,但我需要将其以十进制写入控制器。

所以我有 7 个复选框,每个复选框代表一个二进制数字(所以星期一是 1,星期二是 2,星期三是 4,星期四是 8,依此类推)所以当我想从中创建一个十进制数时,这很容易,只需总结检查了哪些复选框,完成了。

但是现在我需要它,这次我从控制器得到一个十进制数(表示设置了哪些天),我需要在复选框上表示它,所以可能将十进制转换为二进制但是我如何链接复选框到单个数字?

希望有人能理解这一点并帮助我。

这些是我的复选框,这是我的一些 javascript:

我该如何反其道而行之?我得到一个十进制数,需要转换为二进制,然后使用 javascript 根据设置的位检查正确的复选框。

有什么建议么?

0 投票
2 回答
294 浏览

c++ - std::map 是否锁定其节点以防止其他进程删除它们?

我在这里遇到了一个严重的问题。我有两个不同的任务(如一个进程)在我的 PLC X20 表单 B&R 上运行,访问一个单例对象“VarList”。其目的是允许通过指针进行进程间通信。

任务 A 正在使用静态 getInstance() 方法创建包含 std::map 的对象。如果将该对象分配给全局 PLC 变量以允许从每个任务访问该特定对象,则该指针会出现。该任务还检查每个任务周期是否将变量插入到该映射中。在这种情况下,它会尝试再次删除该插入的节点,仅出于测试目的。

任务 B 通过 getInstance 方法获取对象的指针,并将 bool* 插入到映射中。

之后任务 A 尝试再次删除它,但它因访问冲突而崩溃。我可以访问节点及其值。我可以改变那个值。但是擦除在不同任务中创建的节点会导致崩溃,我想知道为什么!

PLC 是单线程的,因此不应有对内存的并发访问。

这是锁定问题吗?或者这是一个逻辑问题?STL 问题?空指针问题?或者可能又是plc供应商的std库的具体实现问题?任何与访问冲突相关的帮助表示赞赏!

以下是提到的对象的代码片段,我删除了与问题无关的所有内容,只是为了获得提示。抱歉,它很可能无法编译:

编译器:gcc 4.1.2

任务一:

任务 B:

变量列表.hpp

变量列表.cpp

谢谢!

0 投票
1 回答
227 浏览

vba - VBA 子程序不退出循环

我是编程新手,所以我希望你能帮助我。不知道如何制定正确的问题,所以我没有找到任何 StackOverflow 答案。

当我逐步执行此代码并来到 OpcServObj.Connect OpcServerStrg 时,它没有连接。我没有收到任何错误,似乎没有任何事情发生。光标跳到左边距,什么也不做。只有当我继续单步执行例程时,它才会重新启动该功能。它应该继续并退出我计划再次测试连接状态的 for 循环。

参考库:OPC DA Automation Wrapper 2.02

谢谢

0 投票
1 回答
984 浏览

c# - OPC Da 在字中写入位

我正在使用 OPC DA 自动化包装器连接到 AllenBradley PLC。

我现在需要在一个单词中设置一个位,独立于任何其他位。

有什么方法可以严格实现这个功能吗?

我尝试过的两个选项是:

在 OPC 服务器 (Kepware) 中将单词设置为单独的位。所以换句话说,我有 16 个标签,每个标签都有一点,标签名称看起来像:

但是,这意味着我需要保留许多单独的 OPCItem 对象

另一种方法是读取整个字,使用 将其转换为位BitConverter,更改我需要更改的位,然后将保留字写回 PLC。

然而,在测试过程中,我发现线程 1 可以读取这个词。然后线程 2 将写入字,更改位 2。然后线程 1 将更改位 4 并将整个字写回,而对位 2 的更改将被覆盖。

有谁知道我可以拥有一个 OPCItem 并写入特定位的方法?还是我坚持有很多与某个位相关的 OPCItems?

谢谢

0 投票
2 回答
1662 浏览

vpn - 与树莓派和 hamachi 的 PLC 通信

我试图建立的系统由几个通过以太网连接到 Raspberry Pi 的 PLC 组成。然后将 Pi 连接到 Hamachi VPN(我使用 hamachi,因为我们没有用于其他 VPN 解决方案的外部 IP。如果有另一种选择,我愿意尝试)。在另一端,有一台 PC 连接到 Hamachi 网络。我需要能够与连接到 Pi 的 PLC 交谈(ping 和连接)。我已经能够使用 iptables 让 PC 与一个 PLC 对话,但不是通过它自己的 ip,而是购买指向 hamachi ip 的软件。我可以使用 iptables 从 PLC ping PC,但反之则不行。我的最终目标是能够通过 hamachi vpn 使用 PLC 的 ip 从 PC 访问 PLC。有什么想法或方向吗?

0 投票
3 回答
5652 浏览

excel - 如何将多个 Siemens PLC 的数据导入 Excel?

我使用 Siemens WinCC SCADA 系统,我需要将数据从 Siemens PLC 中的特定地址传输到 Excel 以进行报告。

是否值得尝试通过在 WinCC scada 中编程或是否有任何其他报告工具?我的主要要求是:

  • 轻松定义要读取的 PLC 和数据地址
  • 在 Excel 中自定义报告视图(添加徽标、调整格式等)
  • 以表格形式和 Excel 图表形式提供数据
  • 价格应该不会很高

顺便说一句,我在现场有一台小型平板电脑。这台电脑有 1 GB RAM 和 Intel Celeron CPU。报告应用程序必须在如此小的 PC 中运行。