台灣最大程式設計社群網站
線上人數
600
 
會員總數:244807
討論主題:188842
歡迎您免費加入會員
討論區列表 >> C# >> ASCII轉換成2位元數字,然後要換算成2字元的文字
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
ASCII轉換成2位元數字,然後要換算成2字元的文字
價值 : 20 QP  點閱數:229 回應數:9

樓主

Steven HO
初學者
80 17
405 55
發送站內信

這個是在PLC 16bit點位要輸入兩字ASCII碼的問題

例如ASCII的a,PLC只支援10位元與16位元輸入

查ASCII表得知要輸入97(十進位)

二進位則是01100001


那如果要輸入aa兩個ASCII碼,就要輸入0110000101100001
要換算成10進位或16進位才能輸入(十進位為24929)

覺得好麻煩,有沒有更快速的方法

我是用三菱PLC Monitor Unity的Device write

謝謝




搜尋相關Tags的文章: [ PLC ] , [ ASCII ] , [ PLC Monitor ] , [ 16bit ] ,
本篇文章發表於2019-04-23 08:59
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

誰是誰
檢舉此回應
完全沒法理解整個問題的重點, 倒底是誰要轉成誰?
本篇文章回覆於2019-04-23 13:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

P陳
檢舉此回應
第1位 * 256 + 第2位 如下
97*256+ 97 = 24929

asc("a")*256 + asc("a")

只是我也看不懂您要的是啥東東,只能見招拆招
本篇文章回覆於2019-04-23 15:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

Steven HO
檢舉此回應
最後我自己又改好了....
假設點位裡是8S(ASCII)轉成整數就是21304
那我們要怎麼把21304轉回8S呢??就要透過以下公式



這公式是抄來的,事實上我也覺得很神奇

(a / 256) * 256)這個不是在脫褲子放屁嘛??事實不然,我猜是因為(a / 256)是在INT範圍,所以結果是整數

例如21354/256=83,83*256=21248,所以有差別,但我不知道為什麼倒是~~
本篇文章回覆於2019-04-24 16:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

P陳
檢舉此回應
a - ((a / 256) * 256)) <--- 求餘數的算法
用 a mod 256 就可以了
------------------------------
你的題目是 aa 如何變成24929
最後
你自己卻變更題目成 反向動作。 求 21304 如何變成 8S。

本篇文章回覆於2019-04-24 20:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

Steven HO
檢舉此回應
大大不好意思,的確我問題跟我解答剛好是相反的

我原本是要在PLC的程式上輸入數據

後來反而抄了一隻程式接收ASCII的程式

原來是取餘數的方法

謝謝你了

不過我把這個點數給關了,如果你要點數的話

請到我另一個問題裡隨便回我就先結案把點數給你

https://www.blueshop.com.tw/board/FUM20050124192253INM/BRD20190424164038I12.html

謝謝您唷~~
本篇文章回覆於2019-04-24 23:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

Steven HO
檢舉此回應
所以大大
我C#的程式只要改成這樣
string b = Convert.ToChar(a % 256)) + Convert.ToString(Convert.ToChar(a / 256));
餘數是PLC 16bit裡的下8位bit,商是上8位bit

那我如果要反求回來呢,只知道B(應該是2個ASCII字元),例如8S,要怎麼轉換回a

謝謝
本篇文章回覆於2019-04-24 23:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

Steven HO
檢舉此回應
今天上班後,試了一試

8在ASCII十進位是56
S在ASCII十進位是83

所以要顯示8S就是要83*256+56
有沒有人發現怎麼會剛好相反,原因是PLC的存取區就堆疊一樣
16bit有分上八位跟下八位,先進去的當頭,後進去的就是後面了


結論
1.
如果要取ASCII字元給PLC(16bit位元),請查ASCII表十進位的值,假設為8跟S,上面已經查出數值了
就要輸入21304=83*256+56
↑ ↑
S 8

會先進後出變更為8S

2.
如果在PLC上只能抓到21304
公式是8S = Convert.ToChar(21304 % 256)) + Convert.ToString(Convert.ToChar(21304 / 256)); //+號代表字串相結合
↑ ↑
8 S
這是用在16bit的點位
如果是8bit的點位就簡單了
只要查ASCII表十進位數值*256就是PLC要的數值
還原就用/256再查表就知道哪個字
本篇文章回覆於2019-04-25 08:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

Steven HO
檢舉此回應
不過我還有個問題

為何要乘除256阿??
本篇文章回覆於2019-04-25 09:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

P陳
檢舉此回應
10進位是乘 100 =>10*10
16進位是乘 256 =>16*16
Convert 還有很多功能可以用,您可以再找看看
----------------------
至於點數請別在意 (重點不在點數,在有幫到大家) 因為我也是被幫上來的
本篇文章回覆於2019-04-26 10:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.