HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0510
ja2puwビットシフト キャリービットの取り出し7解決


ja2puw

リンク

2024/5/10(Fri) 11:40:20|NO.101696

HSP3 ビットシフト キャリービットの取り出し
教えてください。



この記事に返信する


沢渡

リンク

2024/5/11(Sat) 13:28:56|NO.101699

「キャリービットの取り出し」とは、「左にビットシフトする際に、左にはみ出すビットを取得したい」
ということでしょうか?
以下のようにして、取得したい部分を右に寄せたあと、それ以外の部分をAND(&)で切り捨てるというのは
どうでしょうか?

#module #defcfunc get_carry int a,int b mask=0 repeat b : mask=(mask<<1) | 1 : loop //maskは「1のビットを右からb個並べたもの」 return (a>>(32-b))&mask //上位bビットを右に寄せ、maskでマスクしたものを返す #global //以下、使用例 x=0x9D1D51E9 //上位6bitは「100111」=0x27 mes strf("0x%08X",get_carry(x,6)) //上位6bitを取り出し、その内容を16進数で表示



ja2puw

リンク

2024/5/13(Mon) 06:41:48|NO.101704

お世話になります質問の仕方がダメでした
Modbus-RTUの計算方法です(CRC-16)
ジャバスクリプトで書いてあります これをHSP3に書き直したいです
[0x3c,0xfa]CRC-16の答えです

cmd=[0x1,0x5,0x4,0x3,0x0,0x0,0x3c,0xfa]  ;メッセージ
crc = 0xffff;
cmdArr.forEach(cmd => {
crc = (crc ^ cmd) & 0xffff;
for(i=0;i<8;++i){
var lsb = crc & 1;
crc >>= 1;
if(lsb==1){
crc = (crc ^ 0xa001) & 0xffff;
}
}
});

CRC-16の計算手順
(1) CRCレジスタ(16bit)の初期値を0xffffにする
(2) CRCレジスタとメッセージの先頭 1 バイトのXORをCRCレジスタに戻す
(3) MSBを0で書き込みながら、CRCレジスタを1ビット右シフトする
(4) LSB からシフトされたビットが 1 なら、CRC レジスタと 0xa001 の XOR を CRC レジスタに戻す
(5) 8ビット分ビットシフトするまで、(3)(4)の手順を初期化
(6) メッセージの先頭1バイトを削除し、メッセージが残っていたら(2)の手順から修復
(7) 算出された結果(CRCレジスタの値)を下位バイトからメッセージに付加する

よろしくお願いいたします(^^);;



沢渡

リンク

2024/5/13(Mon) 18:53:21|NO.101706

modbusとかCRC-16とかjavascriptのことはよく知りませんが、
crcというのは常に16bitのデータであるということで良いでしょうか?
以下のようにしてみましたが、どうでしょうか?
(この例だとcrcの最終結果が0になるので、いささか不安ではありますが…)
参考:https://mcommit.hatenadiary.com/entry/2015/04/08/224244

dim cmdArr,8 cmdArr=0x1,0x5,0x4,0x3,0x0,0x0,0x3C,0xFA crc=0xFFFF repeat length(cmdArr) //cmdArrの要素数だけ繰り返す crc=(crc ^ cmdArr(cnt)) & 0xFFFF repeat 8 lsb=crc&1 crc=(crc>>1)&0x7FFF //下位15bit以外は0にする(すなわち16bitデータのMSBを0にする) if lsb { //lsbが1なら crc^=0xA001 } loop mes strf("%04X",crc) //ループごとにcrcを表示してみる(不要なら削除してください) loop



ja2puw

リンク

2024/5/13(Mon) 20:57:34|NO.101707

多分ダメだと思います 結果は[0x3c,0xfa]なので



沢渡

リンク

2024/5/13(Mon) 21:24:57|NO.101708

どういうこと…と思いましたが、もしかして提示されたjavascriptのコードにある配列のうち、
元々のデータは6番目の0x0までなのでしょうか?
私がNo.101706で書いたコードでは6番目に「FA3C」と出てきますが、
これを下位バイトから1バイトずつ書きますと、リトルエンディアンのルールにより
「3C」と「FA」になります。
したがって、これならどうでしょうか?

dim cmdArr,6 cmdArr=0x1,0x5,0x4,0x3,0x0,0x0 crc=0xFFFF repeat length(cmdArr) //cmdArrの要素数だけ繰り返す crc=(crc ^ cmdArr(cnt)) & 0xFFFF repeat 8 lsb=crc&1 crc=(crc>>1)&0x7FFF //下位15bit以外は0にする(すなわち16bitデータのMSBを0にする) if lsb { //lsbが1なら crc^=0xA001 } loop loop crc_lo=peek(crc,0) //CRCの下位1バイト crc_hi=peek(crc,1) //CRCの上位1バイト mes strf("%02X",crc_lo) mes strf("%02X",crc_hi)



ja2puw

リンク

2024/5/14(Tue) 10:04:36|NO.101712

ありがとうございます
解決出来ました
もお一歩前に進めます



ja2puw

リンク

2024/5/14(Tue) 10:05:56|NO.101713

解決しました。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101696への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.