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