2017年2月28日 星期二

[C#/Modbus] 使用NModbus4讀取Modbus slave的數值(float)

說明:
讀取Modbus slave的input register,1個register為2 bytes,
因此要得到一個float數值,需2個registers。
而Modbus資料排列為big-endian格式,需轉換為little-endian以得到正確數值。




另IEEE-754下float有效位數為7-8位,若寫入slave數值超過有效位數,會造成誤差,
而C#的float有效數值為7位。


參考資料:
https://www.h-schmidt.net/FloatConverter/IEEE754.html
http://ftp.icpdas.com.tw/pub/cd/8000cd/napdos/modbus/nmodbus/nmodbus_api_manual_v1.2_cht.pdf
https://www.mesta-automation.com/modbus-with-c-sharp-libraries-examples/

2017年2月7日 星期二

[.Net/C#] Multi-Thread使用lock造成Deadlock的狀況

使用多執行緒時,常會使用lock,防止不同執行緒對共享參數存取造成非預期的結果。
如:
設備開關控制,thread A要對設備送出open指令,
此時thread B啟動,要對設備送出close指令,
但thread B先執行完畢,最後設備仍然是open的。

因此,可使用lock對設備狀態進行鎖定,使執行緒同步化,
但使用lock可能因兩個thread互相等待造成Deadlock。
如:
worker thread異動資料後,觸發事件後,由UI thread取得該資料來顯示,
就造成thread互相等待而死結。


另外,lock也需針對個別變數使用不同的object,避免單核心CPU進行context switch後造成死結情形。