2017-12-03 145 views
0

我在寫入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成功」,但該位狀態不變。

開始懷疑它是否是施耐德專有的東西。

其他人都有過這方面的經驗嗎?

回答

0

好的,所以我發現我做錯了什麼。我沒有正確設置單位ID。當它應該是「255」時,它在「1」。

這裏的SoMachine中萬一別人設置的截圖發現自己在同樣的情況:

enter image description here