标签: modbus

串行编程:测量字符之间的时间

我正在 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 库,但我想在其他应用程序中使用它)

c serial-port modbus timing

3
推荐指数
2
解决办法
3599
查看次数

像StrTok()或Sscanf()这样的东西?

所以,我正在通过串口从ModBos读取并获得如下所示的读数: '+0020.8+0022.8-00.046-00.002-00.005-001.99+00.000+00.003';

基本上,总会有8个浮点读数,前面带有加号或减号,尽管它们的字符长度可能不同.

获取值为浮点数组(或字符串数​​组或TSringList)的最有效方法是什么?

我不确定,但这可能是时间关键,所以效率可能优于优雅.

delphi modbus

3
推荐指数
2
解决办法
2233
查看次数

如何使用Modbus ping仪表

我正在尝试使用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)

modbus

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

C#BackgroundWorker和Com端口问题

好.我有一个监控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)

c# multithreading modbus backgroundworker

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

MODBUS,设备响应的最长时间是否存在?

在与 MODBUS 设备通信时,设备在被视为超时之前可以花费多长时间进行响应是否有上限?我正在尝试弄清楚如何设置读取超时。MODBUS RTU 和 TCP 的答案都很好。

tcp serial-port communication modbus serial-communication

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

在Vapi定义中用于通过引用传递数组的参数

我有以下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)

modbus vala vapi

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

libmodbus交叉编译并安装在Beaglebone中

任何人都可以告诉我如何为beaglebone安装和交叉编译libmodbus库(libmodbus.org)?

我尝试编译我的本地机器安装了ubuntu并且库已正确安装并且工作正常.但我想为beaglebone安装.我在本地机器上有beaglebone的文件系统(目标网络文件系统)

我想写一个modbus主(客户端)rtu代码并在我上面提到的板上运行.请指导我完成这项工作.

linux modbus cross-compiling

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

python pymodbus读取保持寄存器

我是 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)

现在的问题:

  1. 我从寄存器 1000, 10 Words, with slave number 0 中读取。这是正确的,但是值 38 是什么意思 …

modbus python-2.7

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

将 32 个布尔值的集合转换为 32 位整数

所以我是 C# 新手,我已经搜索过,但我只是不知道我在搜索什么。

我有一个名为 input 的布尔变量,它保存了 ModBus 接口库中的 32 个真/假位。

这是解释我的 32 个真/假值的图像。基本上,这 32 个真/假值存储在输入中。我需要将它们整理成一个 32 位整数。

我想知道的是如何将这 32 个值整理成一个 32 位字符串,即 (0000 0000 0000 1000 1000 1000 1000 1000),这显然是一个 32 位整数,并给我一个十进制数 88888。

我现在陷入困境,因为我不确定我应该使用什么命令。

c# modbus type-conversion modbus-tcp

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

如何在树莓派上实现Modbus?

我目前正在进行一个项目,尝试以 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)

python modbus rs485 raspberry-pi raspberry-pi4

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