GOT2000スクリプト 色々


三菱電機製タッチパネルGOT2000を入手したので勉強のために調べたことを色々書くことにした。
（ネタが思いついたら追記します）

# 内部レジスタ
GOT1000では外部から内部レジスタをモニタ出来ませんでしたが、
GOT2000からは下記オプション有効にすることで、外部からモニタが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/41e2df02-d61a-7157-647f-2471dd8e7d78.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/3139b96c-d416-d4a3-975e-dfe99faa6fc8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/3ca54313-186d-3743-96f5-3863d5970fe5.png)



GOT内部デバイス(すべて10進デバイスです)

|デバイス|範囲|備考|
|---|---|---|
|GOTビットレジスタ|GB0～GB65535|GB0～GB63はGOT内で用途割り当て済み|
|GOTデータレジスタ|GD0～GD65535||
|GOT特殊レジスタ|GS0～GS2047||
|テンポラリワーク|TMP0～TMP1023||
|スクリプト部品テンポラリワーク|PTMP0～PTMP1023||
|SoftGOTビットレジスタ|SGB0～SGB65535||
|SoftGOTデータレジスタ|SGD0～SGD65535||
|ゲートウェイデバイス|EG0～EG32767||
|GOT Mobile ビットレジスタ|VGB0～VGB32767||
|GOT Mobile データレジスタ|VGD0～VGD32767||

## GOTビットレジスタ(GB),GOTデータレジスタ(GD)
GOTが内部に持っているデバイスで自由に使える。
GOT内のデバイスなのでPLCのデータとは直接リンクはしていない。
デバイスデータ転送やスクリプトにてPLCのデータをGB,GDに読み書きすることは可能。
GB0～GB63はGOT内で用途割り当て済みのため書き込みは禁止
GB40が常時ON,GB41が常時OFF
GT Designer3 (GOT2000) Version1.215Z 以降はデバイスの停電保持設定が可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/f24ada81-1d80-58e6-8593-f12107457432.png)

## GOT特殊レジスタ(GS)
GOTが内部に持っている特殊レジスタです。
GOTの内部情報，通信状況，エラー情報などが格納されます。

参考マニュアル:GT Designer3 (GOT2000) 画面設計マニュアル SH-081219 付録 12.1.3 GOT特殊レジスタ(GS)

## テンポラリワーク(TMP)
スクリプト内で使用可能なテンポラリ用デバイスです。
スクリプト内でしか使えないのでTMP0を数値表示のデバイスに設定するなどはできません。
TMPはグローバル変数なので別のスプリプトからも参照可能です。
1つのテンポラリワークは64ビットで扱われます。
ビットデバイスとして扱う場合は16ビット相当となります。

## スクリプト部品テンポラリワーク(PTMP)
個々のスクリプト部品のスクリプト内のみで共有されるローカル変数です。
同じスクリプト部品内のスクリプト同士では値の共有が可能です。
1つのスクリプト部品テンポラリワークは32ビットで扱われます。
ビットデバイスとして扱う場合は16ビット相当となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/8ea47b0c-e47f-fe26-be41-8d48de8ccd75.png)

## SoftGOTビットレジスタ(SGB),SoftGOTデータレジスタ(SGD)
機種がGT SoftGOT2000のときに使えるデバイスです。
使用方法はGB,GDと同じ

## ゲートウェイデバイス(EG)
別のGOTからでもEGデバイス経由することでPLCのデータを読み書きが可能のようです。
このへんを活用すると闇が深くなりそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/28daaf16-54b3-c577-798a-3a05d1100548.png)

## GOT Mobile ビットレジスタ(VGB),GOT Mobile データレジスタ(VGD)
GOT Mobile用の画面を作成した時のGB,GDデバイスです。
GDデバイスを使うと複数の端末からアクセスしたとき表示画面がすべて同じになってしまうので接続端末毎にVGB,VGDを用意するようです。
GB,GDをVGB,VGDに割り当てるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/f2a001e3-26b5-e66e-e600-da1367054314.png)

# デバイスの読み書き方法

|種類|書き方|
|----|----|
|ビットデバイス|[b:X100]|
|ワードデバイス|[w:GD100]|
|符号付きBIN8|[s8:GD100]|
|符号なしBIN8|[u8:GD100]|
|符号付きBIN16|[s16:GD100]|
|符号なしBIN16|[u16:GD100]|
|符号付きBIN32|[s32:GD100]|
|符号なしBIN32|[u32:GD100]|
|符号付きBIN64|[s64:GD100]|
|符号なしBIN64|[u64:GD100]|
|BCD16|[d16:GD100]|
|BCD32|[d32:GD100]|
|BDC64|[d64:GD100]|
|実数(32ビット)|[flt:GD100]|
|実数(64ビット)|[flt64:GD100]|
|ラベル指定|[<$:グループ名:ラベル名>]|
|ワードデバイス(オフセット)|[w:GD100[w:GD200]]|
|ビットデバイス(オフセット)|[b:X100[w:GD200]]|
|ワードデバイスのビット指定|[b:D100.b1]|
|ビットデバイスのワード指定|[w:X100]|


```C
[w:GD100]=[w:D100];//D100→GD100へ転送
[w:GD110]=[w:D100[w:GD101]];//D100(オフセットGD101)→GD110へ転送
```
こんな風に書くのですが、制約があり一部の書き方はオブジェクト内のスクリプトでは使えず、普通のスクリプトだと使えたりします。
何が出来て何が出来ないのかがわかりずらいので書いてみてエラーが出ておかしいと思ってマニュアルを漁ると出来ないとに気づくということはよくあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/3c6199f9-4f5f-bf20-c9db-95c6c925d206.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/4aa979fc-b2af-02ff-8ee9-532a21c51d32.png)

C言語っぽいただのスクリプトなのでマニュアルに書いてあることしか出来ません。
演算中の内容はモニタできないので、どこかのデバイスに吐き出して数値表示部品で確認するしかないです。
長い計算式はこまめにGDデバイスに書いてデバッグ出来るようにしないと苦労します。

# オブジェクト内部変数

**$$** モニタデバイス値をスクリプト参照します。
**$K** タッチキーから入力された最新のキーコードを，スクリプトで処理する場合に参照します。
**$V** オブジェクトで表示する値を変更する場合に代入します。
**$W** 書き込むときに，スクリプトで処理した値を使用する場合に代入します。

例えば下の場合だとD200の値($$)に+20を行い数値表示($V)に代入されます。D200が100だと数値表示が120になると言うことですね。
この程度の計算だとデータ演算で出来ますが複雑なことをする場合はスクリプトで書くしかないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/c014e94f-99ac-d57d-46b6-d7c0eb399f5f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/a51730ac-1420-bd5d-f273-8365ca8e3393.png)

下記の例は入力した数値入力に入力した数値に+1した値を書き込むということが出来ます。
入力した値をルールにしたがって加工したい場合に使えるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/fe5a4fdc-b685-3211-8aaf-408dc214f31e.png)


# まとめ
スクリプトを多用すると自分以外の人に理解されない物ができて苦労します。
スクリプトを使えばファイル操作,検索,コピーが出来ますが闇です