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