我目前正在开发一个允许不同自动化进行通信的项目.为此,我想创建一个客户端和服务器,使用modbus协议进行通信.我不确定我现在是否想要使用ModBus/TCP,ModBus/RTU或ModBus/ASCII.
我在C中搜索了客户端/服务器示例,我可以找到库,但没有简单的通信示例.我想从头开始,所以库不是我想要的.
我要的是,如果有人能给我一个用C语言编写的简单代码用于客户端和/或使用Modbus进行通信的服务器,因为我不确定我将使用任何类型的Modbus将是一个很大的帮助(RTU/TCP/ASCII).
越简单越好,我希望代码演示的是,例如:对服务器的初始化,请求,答案,关闭连接.
非常感谢您的宝贵时间.
c network-programming modbus serial-communication modbus-tcp
我EasyModbus Nuget在C#窗口表单应用程序中使用。我正在尝试使用RTU(实时更新)来获取更改的保持寄存器的地址值ModbusServer。
下面的代码连接到服务器。
void Connect() {
ModbusClient client = null;
client = new ModbusClient("IP Address", 502);
client.Connect();
}
Run Code Online (Sandbox Code Playgroud)
下面的代码获取保持寄存器下面给出的地址值。
client.ReadHoldingRegisters(10001, 1);
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切正常。
我正在阅读有关在EasyModbus中阅读实时更新的信息。我发现此链接可以将保持寄存器的更改后的值自动发送到偶数处理程序。
现在,我有以下代码:
void Connect() {
ModbusServer ser = new ModbusServer();
ser.Port = Convert.ToInt32(Settings.Default.Port);
ser.Listen();
ser.HoldingRegistersChanged += Ser_HoldingRegistersChanged;
ModbusClient client = null;
client = new ModbusClient("IP Address", 502);
client.Connect();
}
private void Ser_HoldingRegistersChanged(int register, int numberOfRegisters)
{
}
Run Code Online (Sandbox Code Playgroud)
运行它时,出现以下错误。
通常,每个套接字地址(协议/网络地址/端口)只能使用一种
发生此错误是因为我添加了ModbusServer代码。
您能否说明为什么会这样?
我想通过节点红色 modbus 节点从数据源读取数据。范围是 -20000 到 20000,但节点无法处理负数,所以我不得不将它们转换为二进制数 (DWORD),将它们拆分为低位和高位字,然后将这些字转换回整数。
var low
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
var a = msg.payload
if (a >= 0){
a = dec2bin(a);
a = parseInt(a,2);
} else {
a = dec2bin(a);
a = a.substr(16);
a = parseInt(a,2);
}
low = { payload: a };
return low;
Run Code Online (Sandbox Code Playgroud)
对于可视化,我想使用仪表板节点,但因此我需要将 2 个二进制字符串连接在一起并将它们转换为 int。
问题:
节点 red 将它们转换为 qword,因此二进制数 1111 1111 1111 1111 1111 1100 0001 1000 被视为 4.294.966.296?,而不是 -1000。但是,如果我用 1 个酸橙填充下一个剩余部分,那么: 1111 1111 1111 1111 1111 1111 1111 …
我有一些在 pymodbus 1.2 下编写的 modbus TCP 代码,相关代码是
result = modbus_client.read_holding_registers(40093, 3)
更新到 pymodbus 1.4.0 后,它无法工作,直到我将新的单元参数放入函数调用中(示例中都包含 unit=1):
result = modbus_client.read_holding_registers(40093, 3, unit=1)
pymodbus read_holding_registers() 中的单元参数是什么意思?我似乎无法在任何地方找到解释。消息来源说“:param unit:这个请求所针对的从属单元”,但我不明白这是什么意思,也不明白除了 1 之外还有什么选择。
所以我是 C# 新手,我已经搜索过,但我只是不知道我在搜索什么。
我有一个名为 input 的布尔变量,它保存了 ModBus 接口库中的 32 个真/假位。
这是解释我的 32 个真/假值的图像。基本上,这 32 个真/假值存储在输入中。我需要将它们整理成一个 32 位整数。

我想知道的是如何将这 32 个值整理成一个 32 位字符串,即 (0000 0000 0000 1000 1000 1000 1000 1000),这显然是一个 32 位整数,并给我一个十进制数 88888。
我现在陷入困境,因为我不确定我应该使用什么命令。
我正在尝试为modbusm.dll创建一个包装器C#文件(win-tech.com/html/mbusocx.htm),我正在使用dumpbin输出.
转储文件modbusm.dll
文件类型:DLL
该部分包含modbusm.dll的以下导出
Run Code Online (Sandbox Code Playgroud)00000000 characteristics 41128817 time date stamp Fri Aug 06 00:48:47 2004 0.00 version 1 ordinal base 27 number of functions 27 number of names ordinal hint RVA name 1 0 000085BA _AbortTheCall@4 2 1 00003441 _CloseConnection@4 3 2 000033A7 _ConnectASCII@12 4 3 000033E1 _ConnectDanielsASCII@12 5 4 000033C4 _ConnectDanielsRTU@12 6 5 0000338A _ConnectRTU@12 7 6 00001019 _ConnectTCP2@12 8 7 00001000 _ConnectTCP@8 9 8 0000829A _DialCall@8 10 9 00003376 _EnableConnectionCallback@4 11 A 00003342 _EnableModbusCallback@8 12 B 00008123 _GetCallState@8 …
我被困在这个套接字客户端Python3代码中:
import socket
import codecs
def Main():
host = '127.0.0.2'
port = 502
mySocket = socket.socket()
mySocket.connect((host,port))
message = codecs.encode('\x00\x00\x00\x00\x00\x06\x01\x04\x00\x01\x00\x02')
mySocket.send(message)
data = codecs.decode(mySocket.recv(1024))
print ('Received from server: ' + data)
mySocket.close()
if __name__ == '__main__':
Main()
Run Code Online (Sandbox Code Playgroud)
它给出了错误
文件“C:\Python34\lib\encodings\utf_8.py”,第 16 行,在解码中返回 codecs.utf_8_decode(input, error, True) UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 11 中的字节 0xb3:无效起始字节
我正在尝试连接到Ananas - Modbus/TCP -服务器
错误是什么?
谢谢!
我将按照http://wiki.ros.org/robotiq中的指示为 Robotiq 夹具安装 ros 驱动程序
,但是为了安装 Modbus TCP 依赖项 ( rosdep install robotiq_modbus_tcp),我遇到以下问题:
错误:以下包/堆栈无法将其 rosdep 键解析为系统依赖项:robotiq_modbus_tcp:无法找到 [rospy] 的 rosdep 定义
PS:我使用的是Ubuntu 16.04(kinetic),
预先非常感谢您帮助我解决这个问题......
目前我正在使用施耐德电力逻辑电气设备。我想从设备读取数据并在系统中显示该值。到目前为止,我发现了 J2mod、Jamod 和 Modbus4Java 库。我使用了所有modbus4java来连接并获取设备的数据。
实际上我仍然很困惑是否应该创建主端或从端。根据我的理解,该设备将是从站,我的系统将是主站(第一个问题)。
以下是我的设备上的设置。表示设备处于从机模式,协议为Modbus RTU。那么,我需要创建一个使用 ModbusRTU 协议与其通信的主应用程序,对吗?(第二个问题)
下面是我的应用程序作为主站并使用 ModbusRTU 协议的代码
public static void main(String[] args) throws ModbusTransportException, ErrorResponseException {
ModbusFactory factory = new ModbusFactory();
SerialParameters params = new SerialParameters();
params.setCommPortId("COM6");
params.setBaudRate(9600);
params.setDataBits(8);
params.setStopBits(1);
params.setParity(0);
ModbusMaster master = factory.createRtuMaster(params);
master.setTimeout(1000);
master.setRetries(0);
long start = System.currentTimeMillis();
try {
master.init();
} catch (Exception e) {
System.out.println( "Modbus Master Init Error: " + e.getMessage());
return;
}
try {
System.out.println("Reg. 1001 Value:" + master.getValue(1, RegisterRange.HOLDING_REGISTER, 3110, …Run Code Online (Sandbox Code Playgroud) modbus-tcp ×9
modbus ×4
c# ×3
python ×2
c ×1
dependencies ×1
dumpbin ×1
easy-modbus ×1
hex ×1
ip ×1
java ×1
javascript ×1
master-slave ×1
node-red ×1
node.js ×1
pymodbus ×1
python-3.x ×1
ros ×1
rospy ×1
sockets ×1
ubuntu-16.04 ×1
wrapper ×1