将线圈(位)写入Modbus PLC

我在写入Schneider Modicon M221 PLC时遇到问题。 我在LibModbus库(C)中使用了Swift wrapper。 我可以读取位和寄存器没有问题 - 只是不能看到写入给他们 - 虽然我得到了来自设备的“成功”响应。将线圈(位)写入Modbus PLC

这是写作为简单的“真正的” 0位使用功能05.

斯威夫特(4)电话:

@objc func writeToPLC() { 

swiftLibModbus.writeBit(address: 0, status: true,

success: {

print("writeBit Success")

},

failure: { (error:NSError) in

print("Error in WriteBit")

})

}

哪写在斯威夫特/ ObjC SwiftLibModbus包装这个功能:

func writeBit(address: Int32, status: Bool, success: @escaping() -> Void, failure: @escaping (NSError) -> Void) { 

modbusQueue?.async {

if modbus_write_bit(self.mb!, address, status ? 1 : 0) >= 0 {

DispatchQueue.main.async {

success()

}

} else {

let error = self.buildNSError(errno: errno)

DispatchQueue.main.async {

failure(error)

}

}

}

}

写入这些C函数库:

int modbus_write_bit(modbus_t *ctx, int addr, int status){ 

return write_single(ctx, _FC_WRITE_SINGLE_COIL, addr,

status ? 0xFF00 : 0);

}

则:

static int write_single(modbus_t *ctx, int function, int addr, int value){ 

int rc;

int req_length;

uint8_t req[_MIN_REQ_LENGTH];

req_length = ctx->backend->build_request_basis(ctx, function, addr, value, req);

rc = send_msg(ctx, req, req_length);

if (rc > 0) {

/* Used by write_bit and write_register */

uint8_t rsp[_MIN_REQ_LENGTH];

//printf("Print %s, %s, %d ", req, rsp, rc);

rc = _modbus_receive_msg(ctx, rsp, MSG_CONFIRMATION);

if (rc == -1)

return -1;

rc = check_confirmation(ctx, req, rsp, rc);

}

return rc;}

的_FC_WRITE_SINGLE_COIL常数为0x05
的_MIN_REQ_LENGTH常数是12

运行时,我在控制台中看到 “writeBit成功”,但该位状态不变。

开始怀疑它是否是施耐德专有的东西。

其他人都有过这方面的经验吗?

回答:

好的,所以我发现我做错了什么。我没有正确设置单位ID。当它应该是“255”时,它在“1”。

这里的SoMachine中万一别人设置的截图发现自己在同样的情况:

以上是 将线圈(位)写入Modbus PLC 的全部内容, 来源链接: utcz.com/qa/259860.html

回到顶部