标签: plc

Pymodbus 读/写浮点数(实数)

我的 AB Micro820 PLC 中有 modbus 映射设置。我有一个 40001 的数组用于写入,一个 42001 的数组用于读取。两者都是 200 个元素和 REAL 类型(32 位浮点数)。我目前可以读写,所以我知道代码可以工作,只是不正确。这些值被读/写为非常小的值(即4.58577478E-19)。有人能指出我正确的方向吗?

#!/usr/bin/env python

from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.payload import BinaryPayloadBuilder
from pymodbus.client.sync import ModbusTcpClient

import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.INFO)

ip_address = "192.168.2.101"

client = ModbusTcpClient(ip_address)
if client.connect():    # connection is OK
    # write float
    builder = BinaryPayloadBuilder(endian=Endian.Little)
    builder.add_32bit_float(77.77)
    payload = builder.build()
    result  = client.write_registers(1, payload, skip_encode=True)
    # read floats
    result  = client.read_holding_registers(2001, 4)
    decoder = BinaryPayloadDecoder.fromRegisters(result.registers, endian=Endian.Little)
    print …
Run Code Online (Sandbox Code Playgroud)

python ethernet plc modbus

6
推荐指数
1
解决办法
2万
查看次数

关于PLC指令的一个问题

当指令序列仍在处理时,输入X1是否会改变?

例如

LD X1
AND X2
OUT Y1

LD X1 // Can X1 loaded here differ from the previous one?
AND X3
OUT Y1
Run Code Online (Sandbox Code Playgroud)

谢谢

plc

5
推荐指数
2
解决办法
464
查看次数

C#.NET中的PLC编程

我可以在C#中编写用于PLC控制的程序吗?怎么样?

c# plc

5
推荐指数
2
解决办法
4万
查看次数

从C#发送FINS命令到PLC

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

PLC有一个非常简单的梯形逻辑如下:如果DM100有值#0001,则触发输出101.00.(这里,"触发器"只是存储区域的符号名称D100,"输出"是输出的符号101.00) 在此输入图像描述

然后我写了一段执行"存储区写"的FINS命令的C#,命令代码为01 02,后跟开始地址,要写入的项目数和数据.C#代码应将#的值写入0001PLC的D100区域以触发ON 101.00.

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

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

  1. 正确配置的端口,节点和地址由CX-Programmer中的"在线工作"确认.我还ping每个IP以确保节点已连接.
  2. UdpClient代码是有效的,因为我写了一个非常简单的服务器/客户端的代码,成功地发送和接收数据包.
  3. 梯形逻辑没有问题.我将梯子转移到PLC并通过Work Online在监控模式下测试并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 …
Run Code Online (Sandbox Code Playgroud)

c# udp plc fins

5
推荐指数
1
解决办法
1万
查看次数

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

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

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

4bytesData := (SHL(SHL(SHL(BYTE_TO_DWORD(in1), 8) OR BYTE_TO_DWORD(in2), 8) OR     BYTE_TO_DWORD(in3), 8) OR in4);

realValue := DWORD_TO_REAL(4bytesData);
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果我使用此网站( IEEE754 分析器/转换器)并转换十六进制值(4479FFFF),我将得到我想要的值,如果我插入十进制值(1148846079),我将得到与我在PLC。

我希望您理解我的问题,非常感谢。

floating-point plc decimal ieee-754 codesys

5
推荐指数
1
解决办法
3万
查看次数

PLC中的定时器 - 结构化文本

定时器如何在PLC结构化文本(ST)中工作?我们如何申报?

我一直在研究PLC的标准(IEC 61131-3),他们不谈ST的计时器.我知道绝大多数PLC程序员都是在梯形逻辑中完成它们,但在这种特殊情况下,我真的需要在ST中声明定时器.

我正在使用罗克韦尔PLC.

plc timer st

5
推荐指数
1
解决办法
5万
查看次数

西门子S7的HTTPS客户端

我有一个RESTful HTTP API。现在,我想将HTTPS请求从我的S7 PLC发送到API。我已经联系了西门子,他们说他们没有HTTPS客户端实现。

但是tcpClient库中有一个模块。而且由于TCP是HTTP over SSL的基础,所以我想问问是否有人已经实现了HTTPSClient或有人知道从哪里开始?

该API仅可通过HTTPS访问以保护隐私。

https plc

5
推荐指数
1
解决办法
2186
查看次数

通过 C# 读/写 S7-1200 位存储器

我正在尝试在 S7-1200 CPU 中的布尔内存上设置值,我使用了 SNAP7 库,但我无法成功使用它:

Result result = new Result();
byte[] Buffer = new byte[26];
Client.DBRead(1, 0, 2, Buffer); 
result.bArret = S7.GetBitAt(Buffer, 0, 1);
result.bMarche = S7.GetBitAt(Buffer, 0, 2);
Client.DBWrite(1, 0, 10, buff);
Run Code Online (Sandbox Code Playgroud)

我的目标是能够在内存上写入值: 在此输入图像描述

这是数据块 1 :

在此输入图像描述

我需要在不使用 OPC 或其他第三方软件的情况下完成此任务。

c# plc s7-1200 siemens

5
推荐指数
1
解决办法
4733
查看次数

使用 S7netplus 在 C# 中读取西门子 PLC s7 字符串

我在使用 S7netplus 读取西门子 PLC S7 1500 的 DB 中的数据时遇到问题。

情况:

  • 我正在运行一个 C# 应用程序。
  • 我在PLC上连接得很好。
  • 我可以读取Boolean、UInt、UShot、Bytes等数据

但我不知道如何读取字符串数据(见下图)

PLC数据

要读取布尔值等其他数据,我使用以下调用:

plc.Read("DB105.DBX0.0")
Run Code Online (Sandbox Code Playgroud)

我了解到,在数据块 105 (DB105) 中读取数据类型为布尔值 (DBX),偏移量为 0.0 我想对字符串应用相同类型的读取。所以我在我的示例中尝试了“DB105.DBB10.0”。但它返回一个字节类型的值“40”(我应该有别的东西)

我看到还有另一种阅读方法

plc.ReadBytes(DataType DB, int DBNumber, int StartByteArray, int lengthToRead)
Run Code Online (Sandbox Code Playgroud)

但我很难了解如何将其应用到我的示例中(我知道之后必须将其转换为字符串)。

继续: - 有没有一种简单的方法可以使用“DB105.DBX0.0”这样的字符串来读取西门子PLC中的字符串数据?- 如果不是,如何在我的示例中使用 ReadBytes 函数?

感谢您的帮助

c# plc siemens

5
推荐指数
1
解决办法
7857
查看次数

将枚举器定义为 DUT 有什么好处?

据我了解,定义的主要目标enumerators是将变量分配给一些数字及其相等的字符串。

我们可以将 var 定义a为our或enum中的任何地方,如下所示:initializing sectionProgramFunction Block

a:(start,stop,operate);
Run Code Online (Sandbox Code Playgroud)

很难,我不知道为什么我们看不到这一点,tabular view但有一个大问题:

将枚举器定义为 DUT 有什么好处?

plc codesys st twincat

4
推荐指数
1
解决办法
778
查看次数

标签 统计

plc ×10

c# ×4

codesys ×2

siemens ×2

st ×2

decimal ×1

ethernet ×1

fins ×1

floating-point ×1

https ×1

ieee-754 ×1

modbus ×1

python ×1

s7-1200 ×1

timer ×1

twincat ×1

udp ×1