通信プロトコル(mod--)メーターセットpst 01----でTF = 1、D39シリーズはコマンドモード2を选択
古いプロトコルとの互換性
1.ホストリーディングメータデータ
| Waitingです。 | バイト0。 | 1 | 2 | 3 |
| 4バイトの時間 | 1~247 | x03 | アドレスは8。 | ロー 8。 |
| メーターアドレス | 関数コードの機能 | 読み出したいレジスタの開始アドレス | ||
| 4 | 5 | 6 | 7 | Waitingです。 |
| N/2バイト高さ8 | ロー 8。 | CRC16ロー 8 | CRC16ハイ8 | 3バイトの時間 |
| 送信数は | CRC16チェック | |||
ASIIでのデータ転送
2.計器の返却
普通の反応
| バイト0。 | 1 |
| 1~247 | 0x03 |
| メーターアドレス | 関数コードの機能 |
| 2 | 3 | 3+n | 3+n | ||
| N | データ0 | …… | データN(偶数) | CRC16L | CRC16h |
| データ長さ | データは | ||||
1)計量データ読み取りコマンド
| 機能性は | 読み出したいレジスタの開始アドレス(アドレスの上位8ビット) | 読み出したいレジスタの開始アドレス(アドレスの下位8ビット) | |
| 1 | 重さを読む | 0x00 | 0x01 |
| 2 | 風袋を読む | 0x00 | 0x02 |
| 3 | ネットを読む。 | 0x00 | 0x03 |
| 4 | 全体コードを読む | 0x00 | 0x07 |
| 5 | i番目のセンサーの内部コードを読み取ると-999999 | 0x00 | 0x0A+i(i=1~16) |
送信する。
| 01 | 2 | 3 | 4 | |
| メーターアドレス | 0x03 | アドレスは8桁。 | アドレスは8桁。 | 0x00 |
| 5 | 6 | 7 |
| 0x04 | CRC16L | CRC16H |
Return toシングル
| 01 | 2 | 3 | 5 | 6 | |
| メーターアドレス | 0x03 | 0x08 | シンボル-またはデータ6 | Data5 | Data4 |
| 7 | 8 | 9 | 10 | 11 |
| Data3 | Data2 | Data1 | Data0 | 小数点右から左 |
| 12 | 13 |
| CRC16L | CRC16H |
例
1.現在の重量を読む
送信01 03 00 01 00 04 15 C 9
現在の総重量が0の場合
0 1 0 3 0 8 30 30 30 30 30 30 30 30 F 8 2 F(最後の2バイトはCRC16チェックコード)
現在の体重は1240です。
01 03 08 30 30 30 31 32 34 30 30 85 96
2.遠隔地ゼロ
送信:0 1 0 6 0 1 0 0 17 9 8 0 4
受信数:0 1 0 6 0 1 0 0 17 9 8 0 4
よくある質問:
1、機器が連続して送信される場合(TF=0など)、コンピュータシリアルポートはデータを受信できますが、コマンドモードはまだ応答しません。
原因1计器パラメータエラー、D2008、D12系列计器TF = 1;D39系列计器はコマンド方式2
2)機器のシリアル故障、テスト0 8を通じて自己テストできます。
3)コンピュータのシリアルポート障害は、シリアルポート2と3を短絡し、シリアルポートツールを介してデータを送信して、送信した同じデータを受信できるかどうかを確認します。
4)配線の問題、メーター 9コアの3番目のピン(RXD)は受信ピンであり、コンピュータの2番目のピン(TXD)に接続する必要があります。
5)メーターはmodbus RTUプロトコルをサポートしていますが、modbusは総重量を読み取るなどの要求があり、そのレジスタアドレスは40001です。この時点で、4つの単語(40001 〜 40004)を一度に読み取る必要があります。
2.データの解釈方法
以下は重さです。
| アドレス:address | 内容は | (重量は1234,56 7) | (体重:234 5 6).7) |
| 40001 | シンボル-またはデータ6、データ5 | 0x31,0x32 | 0x2d,0x32 |
| 40002 | Data4,Data3 | 0x33,0x34 | 0x33,0x34 |
| 40003 | Data2,Data1 | 0x35,0x36 | 0x35,0x36 |
| 40004 | データ0、小数点+0 x 30 | 0x37,0x30 | 0x37,0x31 |
以下は純重量です。
| アドレス:address | 内容は | (重量は1234,56 7) | (体重:234 5 6).7) |
| 40003 | シンボル-またはデータ6、データ5 | 0x31,0x32 | 0x2d,0x32 |
| 40004 | Data4,Data3 | 0x33,0x34 | 0x33,0x34 |
| 40005 | Data2,Data1 | 0x35,0x36 | 0x35,0x36 |
| 40006 | データ0、小数点+0 x 30 | 0x37,0x30 | 0x37,0x31 |
以下は、Siemens 200 smartの例です。
重さを読む:

特に注意:上記の40002はメーターの40001に対応します。
次に、サブプログラムを書く:

サブルーチンインタフェース:

コード部分

II.新しい協定
次のバージョンでのみサポートされています
計装:D2008型(DF)、D12-YF--V 09バージョンD2008-W--V 13バージョン、KL-MPLCのcom2プロトコル1
| レジスター·アドレス | |
| 40060 | ステータスビット0:0:確認済み1:確認中Bit1:オーバーロード0:ノーマル1:オーバーロードBit2:stable 0:stable 2:stableBit3:皮をむく0:皮をむく1:皮をむくBit4:ゼロ0:ゼロ1:ゼロゾーンにないBit5:計測データ有効0:無効1:有効Bit6: センサーエラー 0通信は正常1Bit7: 予備役Bit8~15センサーの個数 |
| 40061 | センサー状態0正常1異常Bit16 1号Bit17 2号...。ビット数:16:16 |
| 40062-40063 | 重量:フロート |
| 40064-40065 | タグ:float |
| 40066-40067 | 正味重量:フロート |
| 40068-40069 | 1番目のセンサー:float |
| 40070-40071 | 2番目のセンサー:float |
| ... | ... |
| 40098-40099 | 16番目のセンサーの内部コード:float |
| 40100 | センサー 0正常1 Bit16 17号Bit17 18号。。。31時32分。 |
| 40101-40102 | センサの内部コードNo. 17:float |
| 40103-40104 | センサ18:float |
| ... | ... |
| 40131-40132 | センサの内部コードNo. 32:float |
合意事項:
スケール測定データが無効な場合:メーターの正味重量は-999999で、小数点が3桁の場合は-999.999です。
アドレス40001に0 x 0017を書き込む。
2、Modbusホスト構成
1つ目:RTUを選択
第二の項目

CLARiXなど

3番目の項目float表示フォーマット

第三項:例を示す。

関連するデコードコード:受信バイトを浮動小数点型に変換する
データ構造の定義
typedef union noneTYPE 32 databyte
{
struct{
INT32U onebyte0 8;
INT32U onebyte1 8;
INT32U onebyte2 8;
INT32U onebyte3 8;
(1)ONEBYTE
INT32 U One 32 Data;
FP 32の FP 32データ;
TYPE 32 DATABYTE;
コードコード:
4バイトを受信する受信順--Rdata [0]、Rdata[1]、Rdata[2]、Rdata[3]
Floatの FP 32データ;
TYPE 32 DATABYTE P_temp;
P_temp.onebyte.onebyte1 = Rdata[0];
P_temp.onebyte.onebyte0 = Rdata[1];
P_temp.onebyte.onebyte3 = Rdata[2];
P_temp.onebyte.onebyte2 = Rdata[3];
F_temp = P_temp.FP 32 data;//F_tempが結果になります。Siemens 200smartでのバイト変換浮動小数点演算は以下の通りです。
例:浮動小数点数123.456は、[0]= 0 x 79 0 x e 9、0 x f 6、[3]= 0 x 42に対応します。
PLCラダー変換PLCラダー変換

効果:

常用例1重さを読む
計装表示総重量68,風袋0
0 1 0 3 0 0 42 0 0 0 2 6 4 1 F
収01 03 04 00 00 42 88 CA F5
例2:リモートゼロ
送信:0 1 0 6 0 1 0 0 17 9 8 0 4
受信数:0 1 0 6 0 1 0 0 17 9 8 0 4
CRC16チェックコード:
/* CRC上位バイト値テーブル */
const unsigned char auchCRCHi[] = {
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0
0x80 0x41 0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x00 0xC1
0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x00 0xC1
0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40
0x01 0xC0 0x80 0x41 0x01 0xC0 0x80 0x41 0x00 0xC1
0x81 0x40 0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40
0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0
0x80 0x41 0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40
0x01 0xC0 0x80 0x41 0x01 0xC0 0x80 0x41 0x00 0xC1
0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40
} ;
/* CRC最下位バイト値テーブル */
const unsigned char auchCRCLo[] = {
0x00 0xC0 0xC1 0x01 0xC3 0x03 0x02 0xC2 0xC6 0x06
0x07 0xC7 0x05 0xC5 0xC4 0x04 0xCC 0x0C 0x0D 0xCD
0 x 0 F、0 x CF、0 x CE、0 x 0 E、0 x 0 A、0 x CA、0 x CB、0 x 0 B、0 x C 9、0 x 0 9、
0 x 08、0 x C 8、0 x D 8、0 x 18、0 x 19、0 x D 9、0 x 1 B、0 x DB、0 x DA、0 x 1 A、
0x1E 0xDE 0xDF 0x1F 0xDD 0x1D 0x1C 0xDC 0x14 0xD4
0xD5 0x15 0xD7 0x17 0x16 0xD6 0xD2 0x12 0x13 0xD3
0x11 0xD1 0xD0 0x10 0xF0 0x30 0x31 0xF1 0x33 0xF3
0xF2 0x32 0x36 0xF6 0xF7 0x37 0xF5 0x35 0x34 0xF4
0x3C 0xFC 0xFD 0x3D 0xFF 0x3F 0x3E 0xFE 0xFA 0x3A
0 x 3 B、0 x FB、0 x 39、0 x F 9、0 x F 8、0 x 38、0 x 28、0 x E 8、0 x E 9、0 x 29、
0x0x2B 0x2A 0xEA 0xEE 0x2E 0x2F 0xEF 0x2D 0
0xEC 0x2C 0xE4 0x24 0x25 0xE5 0x27 0xE7 0xE6 0x26
0x22 0xE2 0xE3 0x23 0xE1 0x21 0x20 0xE0 0xA0 0x60
0x61 0xA1 0x63 0xA3 0xA2 0x62 0x66 0xA6 0xA7 0x67
0xA5 0x65 0x64 0xA4 0x6C 0xAC 0xAD 0x6D 0xAF 0x6F
0 x 6 E、0 x AE、0 x AA、0 x 6 A、0 x 6 B、0 x AB、0 x 69、0 x A 9、0 x A 8、0 x 68、
0 x 78、0 x B 8、0 x B 9、0 x 79、0 x BB、0 x 7 B、0 x 7 A、0 x BA、0 x BE、0 x 7 E
0x7F、0xBF、0x7D、0xBD、0xBC、0x7C、0xB4、0x74、0x75、0xB5、
0x77 0xB7 0xB6 0x76 0x72 0xB2 0xB3 0x73 0xB1 0x71
0 x 70、0 x B 0、0 x 50、0 x 90、0 x 91、0 x 51、0 x 93、0 x 53、0 x 52、0 x 92、
0 x 96、0 x 56、0 x 57、0 x 97、0 x 55、0 x 95、0 x 94、0 x 54、0 x 9 C、0 x 5 C、
0 x 5 D、0 x 9 D、0 x 5 F、0 x 9 F、0 x 9 E、0 x 5 E、0 x 5 A、0 x 9 A、0 x 9 B、0 x 5 B、
0 x 99、0 x 59、0 x 58、0 x 98、0 x 88、0 x 48、0 x 49、0 x 89、0 x 4 B、0 x 8 B、
0x8A 0x4A 0x4E 0x8E 0x8F 0x4F 0x8D 0x4D 0x4C 0x8C
0x44 0x84 0x85 0x45 0x87 0x47 0x46 0x86 0x82 0x42
0x43 0x83 0x41 0x81 0x80 0x40
} ;
/** ****************************************************
関数名INT16U crc16 unsigned char *puchMsg INT16U usDataLen
機能文字列puchMsgおよび長さに基づいてCRCを生成する16
unsigned char *puchMsgという文字列を入力 usDataLenの長さ
出力INT16U CRC16
*******************************************************/
INT16U crc16 unsigned char *puchMsg INT16U usDataLen//文字列puchMsgと長さに基づいてCRC16を生成する
{
unsigned char uchCRCHi = 0 x FF; /* 高CRCバイト初期化 */
unsigned char uchCRCLo = 0 x FF; /* ロー CRCバイト初期化 */
unsigned long uInde x; /* CRCループのインデックス */
while usDataLen--/* 転送メッセージバッファ */
{
uIndex = uchCRCHi ^ *puchMsg++ ; /* CRCを計算 */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uInde x] ;
}
return<< uchCRCHi8| uchCRCLo;
}
//=======================================================適用リード総重量命令(16進)を送信すると仮定します。
01 03 00 01 00 04
チェックコードの生成方法
//TXD_C_temps []は0 1 0 3 0 0 0 1 0 0 0 4(6バイト)を格納します。
INT16U crcData ;
ByteCount = 6;//データは6バイト
crcData = crc16(TXD_C_temps,ByteCount );
TXD_C_temps[byteCount] = crcData >> 8;
byteCount++;
TXD_C_temps[byteCount] = crcData & 0xff;
//この時点で文字列
01 03 00 01 00 04 15 C9
putchars2_8th TXD_C_temps byteCount+1;//シリアルポート経由で送信
发表回复