LRA1 + azbil SDC/R 調節計 UART(CPL ローダ)通信 2022/12/05
ローラ無線モジュール LRA1 の UART2 に 2.5mm ミニステレオプラグを接続。
azbil SDC/R 調節計のスマートローダージャックに挿すと CPL 通信が行えます。
メーカー保証外ですが、RS485 モデルでなくても CPL 通信が使えるというサンプルです。実用(常用)にしないで下さい。
※LRA1 のファームウェア 1.14c 以降が必要です。
配線は、UART2 RX -> ミニプラグの先端(SDC TX)、UART2 TX -> ミニプラグの真ん中(SDC RX)、GND -> ミニプラグのGNDの3本。
仕様したプラグは、富士パーツ商会 3.5mm -> 2.5mm ステレオミニプラグケーブル AD-SPS-06。
プラグのカバーが細いので、スマートローダーのゴムキャップを痛めることはありません。
※途中にハンダ付けタイプの 3.5mm ミニステレオジャックが必要になります。
SDC/R15 の場合はゴムキャップが無いので、ごく普通の 2.5mm ミニステレオプラグで大丈夫です。
OLED (有機ELキャラクタディスプレイ)は、こちらを使用しています。
■LRA1 送信側
'' AzbilSDC_UART_TX.bas 2022/12/03 '' ファームウェア:1.14c 以降が必要 I2cD[31] = $3C ' OLED_I2C_ADRS Gosub _InitOled Gosub _ContrastMax UBaud = 19202 '' 19200 bps + Even(2) Gosub _ClearOled F = 0 Do ''Gosub _ClearOled While UInkey >= 0: Loop '' ←必要 ^ = Chr($02) '' STX ^ = ^;"01" '' 機器アドレス ^ = ^;"00" '' サブアドレス(未使用) ^ = ^;"X" '' デバイス区別コード '' 小数点位置 + PV + SP + OUT + MFB + AUT/MAN + マニュアル操作量(MV) ^ = ^;"RU00";"1454";"3814";"3815";"3816";"3851";"3811";"3902" '' コマンド ^ = ^;Chr($03) '' ETX '' チェックサム S = 0 For i = 0 To ^[] - 1: S = S + ^[i]: Next ''Print "Sum=";S ''2002 S = S & $FF '' 加算結果の下位1バイト S = (- S & $FF) '' 2の補数 ''Print "checkSum=";Form("X02", S) ''2E ^ = ^;Form("X02", S) '' 送信文字列に追加 ''Print ^ UPrint ^ '' UART2 送信 Delay 200 ^ = "" Do X = UInkey '' UART2 受信 If X >= 0 Then ^ = ^;Chr(X) Else Exit EndIf Loop If ^[] = 9 + 4 * 8 Then For i = 0 To 7 @[i] = ("$";Chr(^[8 + i * 4]);Chr(^[9 + i * 4]);Chr(^[10 + i * 4]);Chr(^[11 + i * 4])) Next ' Print "DIG = ";@[0] ' Print "PV = ";Int16(@[1]) / Pow(10, @[0]);".";Abs(Int16(@[1]) % Pow(10, @[0])) ' Print "SP = ";Int16(@[2]) / Pow(10, @[0]);".";Abs(Int16(@[2]) % Pow(10, @[0])) ' Print "OUT = ";Int16(@[3]) / Pow(10, @[0]);".";Abs(Int16(@[3]) % Pow(10, @[0])) ' Print "MFB = ";@[4] / Pow(10, @[0]);".";@[4] % Pow(10, @[0]) ' Print "A/M = ";@[5] ' Print "MAN = ";Int16(@[6]) / Pow(10, @[0]);".";Abs(Int16(@[6]) % Pow(10, @[0])) ' Print "----" LClr: LPrint "pv:";Form("3",Int16(@[1]) / Pow(10, @[0]));".";Abs(Int16(@[1]) % Pow(10, @[0])) '' 検出値 If F = 0 Then ^ ="pv:" Else ^ = "pv " EndIf ^ = ^;Form("3",Int16(@[1]) / Pow(10, @[0]));".";Abs(Int16(@[1]) % Pow(10, @[0])) '' 制御出力 ^ = ^;" ot"; ^ = ^;Form("3",Int16(@[3]) / Pow(10, @[0]));".";Abs(Int16(@[3]) % Pow(10, @[0])) 'If F = 1 Then ^[2] = Chr($20) EndIf Send ^ Gosub _DrawText1 '' 設定値 If F = 0 Then ^ ="sp:" Else ^ = "sp " EndIf ^ = ^;Form("3",Int16(@[2]) / Pow(10, @[0]));".";Abs(Int16(@[2]) % Pow(10, @[0])) '' モーターフィードバック値 ^ = ^;" fb" ^ = ^;Form("3",@[4] / Pow(10, @[0]));".";@[4] % Pow(10, @[0]) Send ^ Gosub _DrawText2 If F = 0 Then F = 1 Else F = 0 EndIf EndIf Delay 500 Loop End '' カーソル位置 _SetCur '' I2cD[1]=Col,I2cD[2]=Row [0 base] I2cD[0] = $80 + I2cD[2] * $20 + I2cD[1] Gosub _WriteCommand Return _DrawText For k = 0 To ^[]-1 I2cD[0] = ^[k]: Gosub _WriteData Next Return _DrawText1 I2cD[0] = $80: Gosub _WriteCommand For k = 0 To ^[]-1 I2cD[0] = ^[k]: Gosub _WriteData Next Return _DrawText2 I2cD[0] = $80 + $20: Gosub _WriteCommand For k = 0 To ^[]-1 I2cD[0] = ^[k]: Gosub _WriteData Next Return _ClearOled I2cD[0] = $01: Gosub _WriteCommand Return _WriteCommand I2cW I2cD[31],$00,1: Delay 10 Return _WriteData I2cW I2cD[31],$40, 1: Delay 1 Return _InitOled '' Clear Display I2cD[0] = $01: Gosub _WriteCommand '' Return Home I2cD[0] = $02: Gosub _WriteCommand '' Display ON + Cursor ON + Blink ON [8+4+2+1=16=$0F] 'I2cD[0] = $0F '' Display ON + Cursor OFF + Blink OFF [8+4+0+0=12=$0C] I2cD[0] = $0C: Gosub _WriteCommand '' Clear Display I2cD[0] = $01: Gosub _WriteCommand Return _ContrastMax I2cD[0] = $2A: Gosub _WriteCommand ''RE=1 I2cD[0] = $79: Gosub _WriteCommand ''SD=1 I2cD[0] = $81: Gosub _WriteCommand ''コントラストセット I2cD[0] = $FF: Gosub _WriteCommand ''輝度MAX ''標準=$7F I2cD[0] = $78: Gosub _WriteCommand ''SD を0にもどす I2cD[0] = $28: Gosub _WriteCommand ''2C=高文字 28=ノーマル Return■ LRA1 受信側
'' AzbilSDC_UART_RX.bas 2022/12/03 I2cD[31] = $3C ' OLED_I2C_ADRS Gosub _InitOled Gosub _ContrastMax Gosub _ClearOled LClr Do Recv 1000 ''72~720 if Stat = 10 & Rxd[7] = 16 Then ^ = "" For i = 0 To 15 ^ = ^;Chr(Rxd[i + 8]) Next If Rxd[8] = $70 Then LPrint ^ Gosub _DrawText1 Else LPos = 64: LPrint ^ Gosub _DrawText2 EndIf Else LClr Gosub _ClearOled ^ = "cannot receive" Gosub _DrawText1 EndIf Loop End '' カーソル位置 _SetCur '' I2cD[1]=Col,I2cD[2]=Row [0 base] I2cD[0] = $80 + I2cD[2] * $20 + I2cD[1] Gosub _WriteCommand Return _DrawText For k = 0 To ^[]-1 I2cD[0] = ^[k]: Gosub _WriteData Next Return _DrawText1 I2cD[0] = $80: Gosub _WriteCommand For k = 0 To ^[]-1 I2cD[0] = ^[k]: Gosub _WriteData Next Return _DrawText2 I2cD[0] = $80 + $20: Gosub _WriteCommand For k = 0 To ^[]-1 I2cD[0] = ^[k]: Gosub _WriteData Next Return _ClearOled I2cD[0] = $01: Gosub _WriteCommand Return _WriteCommand I2cW I2cD[31],$00,1: Delay 10 Return _WriteData I2cW I2cD[31],$40, 1: Delay 1 Return _InitOled '' Clear Display I2cD[0] = $01: Gosub _WriteCommand '' Return Home I2cD[0] = $02: Gosub _WriteCommand '' Display ON + Cursor ON + Blink ON [8+4+2+1=16=$0F] 'I2cD[0] = $0F '' Display ON + Cursor OFF + Blink OFF [8+4+0+0=12=$0C] I2cD[0] = $0C: Gosub _WriteCommand '' Clear Display I2cD[0] = $01: Gosub _WriteCommand Return _ContrastMax I2cD[0] = $2A: Gosub _WriteCommand ''RE=1 I2cD[0] = $79: Gosub _WriteCommand ''SD=1 I2cD[0] = $81: Gosub _WriteCommand ''コントラストセット I2cD[0] = $FF: Gosub _WriteCommand ''輝度MAX ''標準=$7F I2cD[0] = $78: Gosub _WriteCommand ''SD を0にもどす I2cD[0] = $28: Gosub _WriteCommand ''2C=高文字 28=ノーマル Return