有人可以建议用于Microchip PIC18处理器的Modbus RTU从器件的开源实现吗?我正在寻找用于RS-232/RS-485的Modbus RTU的实现,但也欢迎Modbus TCP/IP实现.
好的..这将是冗长的,但我需要首先解释一些背景.
我的软件的这一部分用于分拣传送带上的物品.我正在使用Modbus作为传送带.Modbus将在特定时间打开门,让物品通过大门.物品将根据重量经过某些门.
我正在监控传感器以确定物品何时在秤上.当传感器被阻挡时,物品被称重并被送到适当的门.定时器设置为打开/关闭门.
我的代码将适用于此..问题是,它不适用于多个项目.我的意思是,当门打开时,传感器不会被监控,直到门关闭.因此,当项目A在前往大门的路上时,项目B在阻挡传感器时不会在秤上称重.我一次最多可以有8个项目.这是我现在运行的代码:
private void SensorThread_DoWork(object sender, DoWorkEventArgs e)
{
if (SensorThread.CancellationPending == true)
e.Cancel = true;
else
{
ReadSensor();
}
}
private void SensorThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//if sensor is blocked
if (sensorstatus == 0)
{
//the timers just start the thread
scaleTimer.Start();
}
else
{
sensorTimer.Start();
}
}
private void ScaleThread_DoWork(object sender, DoWorkEventArgs e)
{
if (ScaleThread.CancellationPending == true)
{
e.Cancel = true;
}
else
{
ReadScale();
//SaveWeight();
prevgate = gate;
gate = DetermineGate();
SetOpenDelay();
SetDuration(); …Run Code Online (Sandbox Code Playgroud) 我能够与PLC建立连接以从中读取数据.现在有一个问题,那就是我必须编写一个方法来修改PLC中的数据.为此,我必须向PLC发送两个值:int值和布尔值.我通过net.wimpi.modbus包中的类解决了int值.但是当谈到布尔值时,我不知道该怎么做.
如果有人遇到和我现在一样的问题,你能不能给我一个参考资料,在那里我可以找到一个解决方案或一个非常好的教程链接来解决我的问题?有人在这个问题上贴了几个链接,但是它发给我的教程与PLC的通信以及如何处理PLC的数据没什么关系.
编辑
我与Modicon M340 PLC建立了连接,对于连接,我使用了net.wimpi.modbus包的类.我发过班,我的代码的连接ModbusTCPTransaction和TCPMasterConnection,和我通过阅读类的价值观ReadMultipleRegistersRequest和ReadMultipleRegistersResponse.
我为连接编写的代码:
private InetAddress m_Address;
private ModbusTCPTransaction m_Transaction = null;
private TCPMasterConnection m_Connection = null;
int port = Modbus.DEFAULT_PORT;
private Activity activity;
public ModbusConnection(Activity activity, String ip)
{
this.activity = activity;
try {
m_Address = InetAddress.getByName(ip);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // the slave'saddress
}
public void getTransaction(InetAddress inet) throws Exception
{
/*Variables for the reading of the …Run Code Online (Sandbox Code Playgroud) 使用C#.net,WPF应用程序.我要连接到设备(MODBUS协议),我必须计算CRC(CRC16).我使用的函数计算正常crc16和值是正确的,但我想要CRC16(modbus)的值.
帮我整理一下.
不熟悉Modbus并使用Modbus RTU开发应用程序.我想知道如何找出RTU消息帧分离时间.在Modbus RTU规范中,它提到了3.5个字符时间,但没有更多关于我如何决定这个间隔的数据.和wat是计算分离时间的步骤?
我是Modbus和PyModBus的新手,但是我花了很多时间尝试阅读和试验它.如果有人能指出我正确的方向,我会很感激...
我在寄存器40001,40003,40005和40007(分别)上有一个带有距离,速度,加速度和减速度的驱动器.我最初能够使用client.write_register(0000,n)写入距离寄存器.在尝试写入速度之后,驱动器开始变得干扰和断裂,并且以应有的速度旋转10倍.但是,真正的优先事项是读取寄存器.我试图从这些寄存器中读取数据并且没有运气.我试过用
request = client.read_holding_registers(0000,4)
response = client.execute(request)
print response
Run Code Online (Sandbox Code Playgroud)
但是,我得到的只是"ReadRegisterResponse(0)".
所以,我的首要任务是尝试从这些寄存器中读取值...任何建议?(顺便说一句,这是通过TCP)
我需要用Java支持03 - Read Holding Registers和编写Modbus RTU主应用程序16 - Write Multiple Registers.
我发现了三个Java库:jamod,j2mod,modbus4j.我尝试了所有这些库(我花了大约4个小时)但它仍然无法正常工作.
您是否知道任何分步教程或示例代码?
我正在使用USB-> RS-485转换器.如果我在QModBus中测试,它运行良好.
谢谢.
import java.io.File;
import com.serotonin.io.serial.SerialParameters;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.code.RegisterRange;
import com.serotonin.modbus4j.exception.ModbusInitException;
public class Modbus4JTest {
public static void main(String[] args) throws Exception {
ModbusFactory factory = new ModbusFactory();
SerialParameters params = new SerialParameters();
params.setCommPortId("/dev/ttyUSB1");
params.setBaudRate(9600);
params.setDataBits(8);
params.setStopBits(1);
params.setParity(0);
ModbusMaster master = factory.createRtuMaster(params);
master.setTimeout(2000);
master.setRetries(0);
long start = System.currentTimeMillis();
// Don't start if …Run Code Online (Sandbox Code Playgroud) 我的 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) 请为我知道之前讨论过的问题道歉,但我找不到答案。我正在尝试创建一个应用程序以通过 Modbus RTU 与我们的微控制器进行通信。是否有任何适用于 Android 的 Modbus RTU 的库,或者我必须自己编写整个代码。?
谢谢
我有一些在 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 之外还有什么选择。