2017-12-03 32 views
0

Schneider Modicon M221 PLCへの書き込みに問題があります。 LibModbusライブラリ(C言語)の周りにSwift wrapperを使用しています。 私はを読んでビットを登録しても問題はありません。と書かれているようには見えません。と書くことができますが、私はデバイスから「成功」応答を得ています。Modbus PLCにコイル(ビット)を書き込む

それはビット0使用して機能05.

スウィフト(4)コールに「真の」書き込みと同じくらい簡単です:スウィフト/にObjC SwiftLibModbusラッパーで、この関数への書き込み

@objc func writeToPLC() { 

    swiftLibModbus.writeBit(address: 0, status: true, 
          success: { 
            print("writeBit Success") 

    }, 
          failure: { (error:NSError) in 
           print("Error in WriteBit") 

    }) 

} 

:ライブラリ内のこれらのC関数への書き込み
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) 
      } 
     } 
    } 
} 

その後、

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定数が_MIN_REQ_LENGTH定数が12

である0x05を
で実行しているとき、私は、コンソールに "writeBit成功" を得るが、少し状況は変わりません。

これはSchneiderの独自のものかどうか不思議に思っています。

誰もがこの分野での経験がありましたか?

答えて

0

さて、私は間違っていたことを知りました。ユニットIDが正しく設定されていませんでした。それが "255"であるべきであったとき、それは "1"であった。

enter image description here

:誰にも同じような状況で自分自身を見つけた場合にはここで

はSoMachineの設定のスクリーンショットです