我正在 Linux 中通过串行线路发送/接收数据,我想找到字符之间的延迟。
Modbus 使用 3.5 个字符的延迟来检测消息帧边界。如果超过 1.5 个字符的延迟,则消息帧被声明为不完整的。
我正在用 C 编写一个快速程序,它基本上是
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
// setup newtio
....
tcsetattr(fd, TCSANOW, &newtio);
for(;;) {
res = read(fs, buf, 1);
if (res > 0) {
// store time in milliseconds?
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以测量这里的时间吗?或者我是否需要以不同的方式查看从串行线路中检索数据?
我还尝试连接到 SIGIO 以在有数据时获取信号,但我似乎一次获取 8 个字节的数据。
(是的,我知道存在一些 modbus 库,但我想在其他应用程序中使用它)
所以,我正在通过串口从ModBos读取并获得如下所示的读数: '+0020.8+0022.8-00.046-00.002-00.005-001.99+00.000+00.003';
基本上,总会有8个浮点读数,前面带有加号或减号,尽管它们的字符长度可能不同.
获取值为浮点数组(或字符串数组或TSringList)的最有效方法是什么?
我不确定,但这可能是时间关键,所以效率可能优于优雅.
我正在尝试使用Modbus协议ping一个Socomec仪表,经过研究,我发现了NModbus,一个C#库.我以前从未使用过库或C#(通常是Java),但我必须直接进入.
我为自己设置了Visual Studio Express for C#并安装了.Net.我已经将NModbus文件的内容复制到我的项目文件夹中,并添加了对两个主要DLL的引用.它不适用于.Net 4,但我重新定位到3.5(并删除了Microsoft.Csharp引用),似乎编译的东西.
我正在使用下面的示例尝试连接到从设备.当我运行它,并将startAdress变量设置为所需的变量(在Socomec文档中找到),但我得到的是一个空白的控制台窗口.
总之,我使用正确的方法/参数,我的设置/代码是不正确的?如何连接此仪表?
我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using Modbus.Data;
using Modbus.Device;
using Modbus.Utility;
namespace NModbus
{
class SerialMaster
{
static void Main(string[] args)
{
ModbusSerialAsciiMasterReadRegisters();
}
public static void ModbusSerialAsciiMasterReadRegisters()
{
using (SerialPort port = new SerialPort("COM1"))
{
// configure serial port
port.BaudRate = 9600;
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.Open();
// create modbus master
IModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port); …Run Code Online (Sandbox Code Playgroud) 好.我有一个监控2个COM端口的程序.一个连接到秤,另一个连接到modbus板.
我的问题是连接到modbus板的COM端口.我的程序每100MS读取一个传感器(在modbus板上).它返回0或1(通过COM端口)以确定传感器是否被阻塞.如果它被阻止,则通过端口向板发送信号.
我的问题是我无法退出监控传感器,但在发送其他信号之前我必须确保com端口未被使用.
监视传感器的例程在后台工作线程上.一旦传感器跳闸,产生另一个线程,向Modbus板发送信号.所以当我向电路板发送信号时,我需要暂停"传感器线程".我该怎么做呢?
请记住它是BackgroundWorker,因此Thread.Join不是一个选项.
这是我的代码:
private void SensorThread_DoWork(object sender, DoWorkEventArgs e)
{
if (SensorThread.CancellationPending == true)
e.Cancel = true;
else
{
ReadSensor();
}
}
Run Code Online (Sandbox Code Playgroud)
此线程的RunWorkerCompleted只是重新启动线程.以下线程持续监视"sensorstatus"以查看传感器何时被阻塞:
public void ScaleThread_DoWork(object sender, DoWorkEventArgs e)
{
if (ScaleThread.CancellationPending == true)
{
e.Cancel = true;
}
else
{
//sensor is blocked
if (sensorstatus == 0)
{
ReadScale();
prevgate = gate;
gate = DetermineGate();
//SaveData();
SetOpenDelay();
SetDuration();
//no gate was selected, meat out of range, runs off end
if (gate == 0)
{
txtStatus.Invoke(new UpdateStatusCallback(UpdateStatus), …Run Code Online (Sandbox Code Playgroud) 在与 MODBUS 设备通信时,设备在被视为超时之前可以花费多长时间进行响应是否有上限?我正在尝试弄清楚如何设置读取超时。MODBUS RTU 和 TCP 的答案都很好。
我有以下C代码使用libmodbus使用ModbusTCP读取单个设备寄存器:
modbus_t *ctx;
uint16_t tab_reg[16];
ctx = modbus_new_tcp("10.0.1.77", 502);
modbus_read_registers(ctx, 0x20, 2, tab_reg);
printf("reg = %d (0x%X)\n", tab_reg[0], tab_reg[0]);
printf("reg = %d (0x%X)\n", tab_reg[1], tab_reg[1]);
Run Code Online (Sandbox Code Playgroud)
现在尝试使用我生成的Vapi将其切换到Vala,new和read的内容是:
[CCode (cheader_filename = "modbus.h", cname = "modbus_new_tcp")]
public static unowned Modbus.modbus_t create_tcp (string ip_address, int port);
public static int read_registers (Modbus.modbus_t ctx, int addr, int nb, uint16 dest);
[CCode (cheader_filename = "modbus.h")]
Run Code Online (Sandbox Code Playgroud)
翻译的Vala程序是:
class ModbusReadTest : GLib.Object {
unowned Modbus.modbus_t ctx;
public void run () {
uint16 reg = 0x00;
ctx = create_tcp ("10.0.1.77", …Run Code Online (Sandbox Code Playgroud) 任何人都可以告诉我如何为beaglebone安装和交叉编译libmodbus库(libmodbus.org)?
我尝试编译我的本地机器安装了ubuntu并且库已正确安装并且工作正常.但我想为beaglebone安装.我在本地机器上有beaglebone的文件系统(目标网络文件系统)
我想写一个modbus主(客户端)rtu代码并在我上面提到的板上运行.请指导我完成这项工作.
我是 Modbus python 的新手,现在我对我的第一步有一些疑问
剧本:
from pymodbus.client.sync import ModbusTcpClient
host = '10.8.3.10'
port = 502
client = ModbusTcpClient(host, port)
client.connect()
#Register address 0x102A (4138dec) with a word count of 1
#Value - MODBUS/TCP Connections
#Access - Read
#Description - Number of TCP connections
request = client.read_holding_registers(0x3E8,10,unit=0)
response = client.execute(request)
print response
#print response.registers
print response.getRegister(12)
print response.registers[8]
client.close()
Run Code Online (Sandbox Code Playgroud)
结果:
============= RESTART: D:\Users\mxbruckn\Desktop\read_modbus.py =============
ReadRegisterResponse (38)
0
0
>>>
Run Code Online (Sandbox Code Playgroud)
现在的问题:
我从寄存器 1000, 10 Words, with slave number 0 中读取。这是正确的,但是值 38 是什么意思 …
所以我是 C# 新手,我已经搜索过,但我只是不知道我在搜索什么。
我有一个名为 input 的布尔变量,它保存了 ModBus 接口库中的 32 个真/假位。
这是解释我的 32 个真/假值的图像。基本上,这 32 个真/假值存储在输入中。我需要将它们整理成一个 32 位整数。

我想知道的是如何将这 32 个值整理成一个 32 位字符串,即 (0000 0000 0000 1000 1000 1000 1000 1000),这显然是一个 32 位整数,并给我一个十进制数 88888。
我现在陷入困境,因为我不确定我应该使用什么命令。
我目前正在进行一个项目,尝试以 Raspberry Pi 4 作为主站来实现 Modbus,并控制多个执行器作为从站。为此,我为我的 Pi 购买了一个特殊的防护罩。我运行了一个演示测试程序,确认 Pi 可以与其新的扩展板配合使用,但后来遇到了麻烦。
Shield 用户手册- 在用户手册文件夹内。
掌握:
## To install dependencies:
## sudo pip3 install modbus-tk
##################################################################################################
import serial
import fcntl
import os
import struct
import termios
import array
#import modbus lib
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus as modbus
#import modbus_tk.modbus_rtu as modbus_rtu
from modbus_tk import modbus_rtu
# RS485 ioctls define
TIOCGRS485 = 0x542E
TIOCSRS485 = 0x542F
SER_RS485_ENABLED = 0b00000001
SER_RS485_RTS_ON_SEND = 0b00000010
SER_RS485_RTS_AFTER_SEND = …Run Code Online (Sandbox Code Playgroud) modbus ×10
c# ×2
serial-port ×2
c ×1
delphi ×1
linux ×1
modbus-tcp ×1
python ×1
python-2.7 ×1
raspberry-pi ×1
rs485 ×1
tcp ×1
timing ×1
vala ×1
vapi ×1