作者popo14777 (草草)
看板C_Sharp
標題[問題] short整數資料overflow解決方式
時間Sat Jul 23 18:11:40 2022
我使用MX component裡面的ActUtlTypeLib類別庫,去讀寫三菱PLC的數據寄存器,
(參考網址:
https://zhuanlan.zhihu.com/p/446264427)
C#程式碼如下:
using ActUtlTypeLib;
public partial class Form1 : Form
{
ActUtlTypeClass textPLC = new ActUtlTypeClass();
private void button1_Click(object sender, EventArgs e)
{
WritePLCY = 1;
textPLC.WriteDeviceRandom("X0", 1, ref WritePLCY);
timer1.Interval = 1000;
timer1.Enabled = true;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
short Readwordbcd;
textPLC.ReadDeviceRandom2("D300", 1, out Readwordbcd);
Console.WriteLine(Readwordbcd);
}
}
PLC從1計數到100萬,每計數一次就存入數據寄存器D300,
計數到32768時,發生了overflow(溢位)
C#執行時,就印出-32768,接著-32767、-32766、-32765....
但我PLC的D300顯示值是正常的(無overflow)
我使用強制轉型
Console.WriteLine((int)Readwordbcd);
Console.WriteLine((long)Readwordbcd);
無論怎麼轉型都還是會印出-32768、-32767、-32766
1.不曉得是不是ActUtlTypeLib類別庫中,
ReadDeviceRandom2方法回傳值型別只能為short
2.想請問還有什麼計算的方式,可以讓讀出的數值變正常
例如-32768變成32768、-32767變成-32769..等
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.161.142.214 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_Sharp/M.1658571102.A.62E.html
※ 編輯: popo14777 (118.161.142.214 臺灣), 07/23/2022 18:12:39
※ 編輯: popo14777 (118.161.142.214 臺灣), 07/23/2022 18:15:01
1F:→ annies5: 為何一定要用short? 07/23 22:52
你是說short Readwordbcd嗎? 如果改int Readwordbcd,ReadDeviceRandom2方法就會無法編譯
要改為ReadDeviceRandom方法才可以編譯,
但輸出後只要超過65565(rang:0~65535)還是會overflow...
註:Readwordbcd為變數名稱
※ 編輯: popo14777 (118.161.142.214 臺灣), 07/23/2022 23:57:41
2F:→ antpro: 用兩個 short 組成一個 int? 07/26 12:24