質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

13437閲覧

PCとPLC間の通信処理について

goo___

総合スコア15

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2016/12/01 14:33

現在、PCとPLC間の通信を無手順で作成しています。
三菱のMXコンポーネントを使用しない通信ソフトを作ろうとしているのですが
動作させたいコードの書き方がイマイチわかりません。

-----------------------処理内容--------------------------------
ベルトコンベアからものが流れてきたらシャッター用センサで検知した値(0)を取得し、
画像処理のプログラムを呼び出し、画像処理のプログラムから判断した
値(0か1)を受け取り、PLCにエアーの噴出命令(1)を返すといったものです

シャッター用センサの値が0になる←センサがいつ変化してもいいように見続ける必要がある?

画像処理のプログラムを呼び出す

画像処理のプログラムから1か0を受け取る

PLCに1を送り、エアを噴出させる


-----------開発環境----------------------
OS:Windows7
開発ツール:Visualstudio2013
プログラミング言語:VBA
PLC:三菱 FX-3uシリーズ


VBA Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load '通信を開く処理 If (SerialPort1.IsOpen() = False) Then '通信設定部開始 SerialPort1.PortName = "COM9" '開くポート名 SerialPort1.BaudRate = 9600 '通信速度 SerialPort1.DataBits = 8 'データ長を設定する SerialPort1.Parity = System.IO.Ports.Parity.None 'パリティなし SerialPort1.StopBits = System.IO.Ports.StopBits.Two 'ストップビットを2ビット SerialPort1.Handshake = System.IO.Ports.Handshake.None 'ハンドシェイク無し End If '通信を閉じる処理 If (SerialPort1.IsOpen() = True) Then SerialPort1.Close() End If 'データを受信 If (SerialPort1.IsOpen() = True) Then Dim receivebuf As String 'シャッター用変数 receivebuf = Convert.ToChar(&H5) & "00FFBR0X001101" '問い合わせ+バイナリ読み込み SerialPort1.ReadExisting(receivebuf) '受信バッファからデータを読み込む 'データを送信 If (SerialPort1.IsOpen() = True) Then Dim sendbuf As String ' sendbuf = Convert.ToChar(&H5) & "00FFBW0Y001601" '問い合わせ+バイナリ書き込み SerialPort1.Write(sendbuf) End If End Sub End Class

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ソースを拝見するとコードの動作がForm1_Loadで、つまりForm1をロードされた際に一度だけ呼ばれる部分に記載されています。
定期的にシャッター用センサの値が0になる←センサがいつ変化してもいいように見続ける必要がある?のであれば、timer割り込みを使用して、定期的にシャッター用センサーの変化を確認する必要があると思います。

投稿2016/12/04 06:37

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

開発ツールおよびコードから察するに、
プログラミング言語は VBA ではなく、VB.NET による WinForms でしょうか。


さておき、
通信処理については次のようなステップとなります。

  1. 通信設定
  2. ポートオープン
  3. 送信伝文生成
  4. 伝文送信
  5. 伝文受信
  6. 受信処理
  7. ポートクローズ (終了)

必要に応じてステップ 3 ~ 6 を繰り返し、
通信処理が必要なくなったら最後にポートをクローズします。

掲載されているコードでは通信設定はされていますが、
Open() していないのでポートがオープンになりません。
また、送受信する前になぜかポートをクローズしてしまっているので
送受信するコードは実行されないようになっています。


ところで、
センサで検知した値が 0 になる瞬間を認識するために、
その値を常に監視する必要があります。
そのためにはシリアル通信を常時おこなわなければいけません。

また、
通信を開始/停止させたり、現在の値を表示させたりするために
UI を使用することになると思います。

UI の描画を処理するスレッドで常時通信処理をおこなってしまうと
UI がフリーズしてしまうため、
別のスレッドで通信処理をおこなう必要があります。
処理の流れは次のようになります。

  1. 別スレッドで常時通信処理をおこなう
  2. 別スレッドでセンサの値が 0 になったら画像処理をおこなう
  3. 別スレッドで画像処理の結果を元にエア出力指令値を決定する
  4. 決定されたエア出力指令値を通信処理で PLC へ書き込む

というわけでやらなければならないことは次の 6 点になります。

  1. (単発でいいので)読み込み伝文を送信して PLC の値を取得できるようになること
  2. (単発でいいので)書き込み伝文を送信して PLC の値を変更できるようになること
  3. 別スレッドで上記 2 点の通信処理を交互に繰り返してできるようになること
  4. 画像処理プログラムを実行して結果をもらえるようになること
  5. UI 操作から通信の開始/停止ができるようになること
  6. 別スレッドの通信処理などの状態を UI スレッドで表示できるようになること

いきなり全部を一度に作ろうとせず、
まずは上記 6 点をひとつずつクリアしていけばいいと思います。


例えば伝文を送信するだけのコードは次のようになると思います。

VB

1Public Class Form1 2 3 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 4 '通信を開く処理 5 If (SerialPort1.IsOpen() = False) Then 6 '通信設定部開始 7 SerialPort1.PortName = "COM9" '開くポート名 8 SerialPort1.BaudRate = 9600 '通信速度 9 SerialPort1.DataBits = 8 'データ長を設定する 10 SerialPort1.Parity = System.IO.Ports.Parity.None 'パリティなし 11 SerialPort1.StopBits = System.IO.Ports.StopBits.Two 'ストップビットを2ビット 12 SerialPort1.Handshake = System.IO.Ports.Handshake.None 'ハンドシェイク無し 13 End If 14 15 'ポートオープン 16 SerialPort1.Open() 17 18 If (SerialPort1.IsOpen() = True) Then 19 Dim sendbuf As String ' 20 sendbuf = Convert.ToChar(&H5) & "00FFBW0Y001601" '問い合わせ+バイナリ書き込み 21 22 'データを送信 23 SerialPort1.Write(sendbuf) 24 25 'データを受信 (デバッグ用) 26 'SerialPort1.Read(rcvbuf, ...) 27 End If 28 End Sub 29End Class

私は VB を知っていますが、実際に使ったことはないので
上記コードがそのまま動くかどうかはわかりません。
また、送信するだけのコードとはいいましたが、
それをデバッグするためには外部にシリアルモニタをつなげるか、
上記コードのように受信処理まで記述して
ブレークポイントを置くなりデバッグ出力するなり、
確認する手段を用意する必要があります。

投稿2016/12/01 18:08

twyujiro15

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問