modbus 相关问题

Modbus是Modicon在1979年发布的串行通信协议,用于其可编程逻辑控制器(PLC)。它简单而强大,已成为事实上的标准通信协议,现在已成为连接工业电子设备的最常用手段之一。

为什么在libmodbus库中未解决的奴隶需要“等待Modbusrtu

有一个从奴隶的请求(已发达的从属)时,它会做出适当的回应。

回答 1 投票 0



回答 1 投票 0



ModbusTCP Android应用

Modbus协议逃脱了线程(Android,Jamod)

回答 1 投票 0

Modbus.Net TcpClient 每 6 次轮询都会失败

我实现了 Modbus.Net v1.4.3 客户端并在主程序中定期轮询数据,并遇到了奇怪的行为。 每 6 次民意调查都会给出: 数据=空 成功=错误 错误代码 = 0 错误...

回答 1 投票 0

使用 netcat/socat 桥接两个端口

我需要通过 TCP 从 ModBus 设备(modbus 从机)获取数据,但该设备必须作为 TCP 客户端公开(在这种情况下,它消耗的电池要少得多)。这意味着两台机器都有...

回答 2 投票 0

PHPModbus 连接失败

我正在尝试使用 Waveshare RS485 转 Eth(b) 网关通过 TCP 连接到 Modbus 设备(千瓦时电表)。 我成功绑定了一个连接,然后发送了一个数据包,但是之后就没有了...

回答 1 投票 0

Modbus TCP 客户端 - 每个命令的新连接

是否有长期使用同一个 TCP 连接并发送数千条 Modbus 命令的做法,或者在大多数情况下,为每个 Modbus 命令打开和关闭一个新连接?

回答 1 投票 0

modbus_connect 无声地失败

正如您所看到的,该库的测试非常标准,因为我是新手。 int main() { modbus_t*ctx; ctx = modbus_new_tcp("127.0.0.1", 502); if (ctx == nullptr) { 是...

回答 1 投票 0

Modbus TCP 到 JavaScript 转换

我想知道 Modbus TCP 协议是否已经导出或转换为 JavaScript 或某种插件,以便可以在像 Dreamweaver 这样的 HTML 编辑器中创建网页,这可以...

回答 2 投票 0

MQTT 和 MODBUS 协议的区别?

我最近一直在阅读这两个协议,但不太明白为什么当我们有 MODBUS 时要使用 MQTT(反之亦然)。 由于MODBUS用于通过串行方式传输数据

回答 4 投票 0

如何使用 QModbusDataUnit::HoldingRegisters 将浮点值发送到保持寄存器? (QT modbus RTU)

刚拿到一个485设备,需要发送数据来运行一些功能。 该设备的手册上说其起始地址为16/17,数据类型为float类型。 我尝试使用...读取寄存器数据

回答 1 投票 0

通过pymodbus获取设备信息

我需要通过pymodbus获取设备信息(设备名称等)。 有谁知道如何做到这一点? 谢谢

回答 3 投票 0

使用pymodbus读取寄存器

我对 Modbus 和 PyModBus 非常陌生,但是我花了很多时间尝试阅读和试验它。 如果有人能指出我正确的方向,我将不胜感激......

回答 3 投票 0

Modbus TCP 中的多主站

我在 Modbus TCP/IP 中遇到了一个关于多主的奇怪问题。我知道Modbus Serial不支持多主机。但是当我看到一些文档时,他们说Modbus TCP支持多主。 我比较...

回答 2 投票 0

CRC 16 Modbus RTU

有人可以提供一个计算CRC的C代码示例吗?这是要发送的字符串 01 04 30 00 00 01。正确的 CRC 是 3E CA。 我尝试在互联网上查找并尝试计算...

回答 2 投票 0

使用 PHP 从 RS485 modbus 获取响应

我正在尝试使用以下脚本从使用 PHP 发送到 RS485 设备的命令中获取响应: 我正在尝试使用以下脚本从我使用 PHP 发送到 RS485 设备的命令中获取响应: <?php class rapidserial{ function _blocking($device,$mode){ stream_set_blocking($device, $mode); return true; } } $rapidserial = new rapidserial(); $device = "COM3"; shell_exec("mode $device BAUD=9600 PARITY=n DATA=8 STOP=2 xon=off octs=off rts=off"); $comport = fopen($device, "r+b"); if ($comport === false) { die("Failed opening com port<br/>"); } else { echo "Com Port Open<br/>"; } //Set non-blocking mode for writing $rapidserial->_blocking($comport,0); $atcmd = "\x0A\x04\x00\x00\x00\x49\x30\x87"; // fputs($comport, $atcmd); usleep(2000); // Set blocking mode for reading $rapidserial->_blocking($comport,1); echo 'Response:'; $res = fgets($comport, 4017); var_dump ($res); fclose($comport); ?> 这取自我在这里发表的相关帖子:https://superuser.com/questions/1815811/issue-addressing-modbus-via-rs485-and-php-on-windows在那里我被帮助发送了命令,帮助我的人提供的脚本有效。现在我尝试发送命令并获取响应,但它不起作用,响应为空。 我也尝试过使用https://github.com/toggio/PhpSerialModbus但它告诉我“无法打开设备”。 我知道我可以与设备通信,因为如果我使用某些 modbus 软件,我可以发送命令并获取响应。 更新:所以我已经从 Windows 设备转移到 Linux 设备来执行此操作,现在我在 PHP 中使用不同的 modbus 类取得了一些成功(https://github.com/toggio/PhpSerialModbus),但是问题是我没有收到所有返回的数据,它似乎被截断了,即使我尝试进一步请求寄存器(不是从零开始),我也没有收到我期望的所有数据。我知道它在那里,因为如果我使用如图所示的 modbus 软件,我可以看到它。 我的代码现在看起来像这样: <?php include("/var/www/html/PhpSerialModbus.php"); $modbus = new PhpSerialModbus(); $modbus->deviceInit('/dev/ttyUSB0',9600,'none',8,2,'none'); $modbus->deviceOpen(); $modbus->debug = false; $rawquery="\x0A\x04\x00\x00\x00\x49\x30\x87"; $modbus->sendRawQuery($rawquery.$modbus->crc16($rawquery),false); $result=$modbus->getResponse(true); function hex2float($strHex) { $hex = sscanf($strHex, "%02x%02x%02x%02x%02x%02x%02x%02x"); $bin = implode('', array_map('chr', $hex)); $array = unpack("Gnum", $bin); return $array['num']; } $bin_result = bin2hex($result); $bin_result = chunk_split($bin_result, 2, ','); $bin_result = substr($bin_result, 9); $myresults = print_r($bin_result, true); $final_array = explode(",", $myresults); print_r ($final_array); ?> 这给了我这个: [0] => 42 [1] => 48 [2] => 33 [3] => 33 [4] => 43 [5] => d3 [6] => 92 [7] => 00 [8] => 43 [9] => 75 [10] => 54 [11] => 86 [12] => 40 [13] => 66 [14] => 66 [15] => 72 [16] => be [17] => dc [18] => 7a [19] => de [20] => 44 [21] => 5c [22] => f0 [23] => 0a [24] => 44 [25] => 34 [26] => 50 [27] => 09 [28] => 42 [29] => f2 [30] => cc [31] => cd [32] => be [33] => f9 [34] => db [35] => 24 [36] => 40 [37] => 25 [38] => c2 [39] => 8f [40] => 42 [41] => 06 [42] => cc [43] => cd [44] => 42 [45] => 90 [46] => 00 [47] => 07 [48] => 42 [49] => ef [50] => 99 [51] => 9a [52] => 43 [53] => d3 [54] => 51 [55] => 65 [56] => 43 [57] => 73 [58] => c2 [59] => 9b [60] => 40 [61] => 80 [62] => PhpSerialModbus.php执行的读取循环是: while( ($byte = $this->serial->ReadPort()) && ((microtime(true)-$startTime)<3.0)) { $responseString=$responseString.$byte; usleep(50); } 它有问题:它只等待 50 微秒,这太短了。没有额外的数据 足够的时间到达并且循环提前终止。也许开发者的意思是 50 毫秒, 所以你可以像这样改变它: usleep(50000); 如果您不想更改 PhpSerialModbus.php,您可以在代码中执行以下操作: $result = $modbus->getResponse(true); do { usleep(50000); $data = $modbus->getResponse(true); $result .= $data; } while($data);

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.