我的 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) 当指令序列仍在处理时,输入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)
谢谢
我尝试通过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没有被触发,也没有收到任何异常.我确定了以下内容:
UdpClient代码是有效的,因为我写了一个非常简单的服务器/客户端的代码,成功地发送和接收数据包. 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) 我有一个通过 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。
我希望您理解我的问题,非常感谢。
定时器如何在PLC结构化文本(ST)中工作?我们如何申报?
我一直在研究PLC的标准(IEC 61131-3),他们不谈ST的计时器.我知道绝大多数PLC程序员都是在梯形逻辑中完成它们,但在这种特殊情况下,我真的需要在ST中声明定时器.
我正在使用罗克韦尔PLC.
我有一个RESTful HTTP API。现在,我想将HTTPS请求从我的S7 PLC发送到API。我已经联系了西门子,他们说他们没有HTTPS客户端实现。
但是tcpClient库中有一个模块。而且由于TCP是HTTP over SSL的基础,所以我想问问是否有人已经实现了HTTPSClient或有人知道从哪里开始?
该API仅可通过HTTPS访问以保护隐私。
我正在尝试在 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 或其他第三方软件的情况下完成此任务。
我在使用 S7netplus 读取西门子 PLC S7 1500 的 DB 中的数据时遇到问题。
情况:
但我不知道如何读取字符串数据(见下图)

要读取布尔值等其他数据,我使用以下调用:
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 函数?
感谢您的帮助
据我了解,定义的主要目标enumerators是将变量分配给一些数字及其相等的字符串。
我们可以将 var 定义a为our或enum中的任何地方,如下所示:initializing sectionProgramFunction Block
a:(start,stop,operate);
Run Code Online (Sandbox Code Playgroud)
很难,我不知道为什么我们看不到这一点,tabular view但有一个大问题:
将枚举器定义为 DUT 有什么好处?