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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

4634閲覧

PCとPLC間でのエラーの解決方法がわかりません

goo___

総合スコア15

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/12/07 03:10

PCとPLC間での通信を専用プロトコルモードで設定しています。
環境
PLC:FX3U-80M
OS:Windows7-32bit
言語:VB.NET
通信規格:RS232C

シーケンサのビットデバイスに書き込むプログラムを作成したのですが
FormのButton3を押すと以下のエラーメッセージが出て、解決方法がわかりません。

動作
Button1でCOMポートを開きます
Button2でCOMポートを閉じます
Button3でテキストボックスのON,OFF状態を書き込みます
テキストボックスはダブルクリックでON,OFFを切り換えます

"エラー内容"
インデックスおよび長さは文字列内の場所を参照しなければなりません。 パラメータ名 length

"SerialPortクラス設定内容"
オブジェクト名:SerialPort1
PortName:COM9
BaudRateプロパティ:9600
DataBitsプロパティ:8
Parityプロパティ:Even
StopBitsプロパティ:One
RtsEnableプロパティ:True
DtrEnableプロパティ:True

-------------------------イメージ説明

VB.NET

1Public Class Form1 2 Dim ENQ As String = Convert.ToChar(&H5) 3 Dim ACK As String = Convert.ToChar(&H6) 4 Dim NAK As String = Convert.ToChar(&H15) 5 Dim tb As String = "Textbox" 6 7 Dim myctls As New ArrayList 8 Dim otb As TextBox 9 10 Private Sub tbdClick(ByVal sender As Object, ByVal e As System.EventArgs) 11 12 If sender.Text = "OFF" Then 13 sender.Text = "ON" 14 sender.BackColor = Color.Red 15 ElseIf sender.Text = "ON" Then 16 sender.Text = "OFF" 17 sender.BackColor = Color.Black 18 End If 19 End Sub 20 21 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 22 Dim i As Integer 23 24 For i = 1 To 2 25 AddHandler Me.Controls(tb & i).DoubleClick, AddressOf tbdClick 26 myctls.Add(Me.Controls(tb & i)) 27 myctls.Item(i - 1).Text = "OFF" 28 myctls.Item(i - 1).BackColor = Color.Black 29 myctls.Item(i - 1).ForeColor = Color.White 30 Next 31 32 Button1.Enabled = True 33 Button2.Enabled = False 34 Button3.Enabled = False 35 End Sub 36 37 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 38 SerialPort1.Open() 39 40 Button1.Enabled = False 41 Button2.Enabled = True 42 Button3.Enabled = True 43 End Sub 44 45 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 46 SerialPort1.Close() 47 Button1.Enabled = True 48 Button2.Enabled = False 49 Button3.Enabled = False 50 End Sub 51 52 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 53 Dim j As Integer = 0 54 Dim sdata As String 55 Dim rdata As String 56 Dim ERCD As String 57 Dim bitdata As String = "" 58 Try 59 For Each Me.otb In myctls 60 If myctls.Item(j).Text = "OFF" Then 61 bitdata = bitdata & "0" 62 ElseIf myctls.Item(j).Text = "ON" Then 63 bitdata = bitdata & "1" 64 End If 65 j += 1 66 Next 67 sdata = ENQ & "00FFBW0" & "Y0020" & "02" & bitdata 68 SerialPort1.Write(sdata) 69 Threading.Thread.Sleep(1000) 70 rdata = SerialPort1.ReadExisting 71 Select Case rdata.Substring(0, 1) 72 Case NAK 73 ERCD = rdata.Substring(5, 2) 74 MessageBox.Show("エラー:" & ERCD) 75 Case ACK 76 MessageBox.Show("正常に受信されました。") 77 Case Else 78 MessageBox.Show("予期せぬ事態が発生しました。") 79 End Select 80 Catch ex As Exception 81 MessageBox.Show(ex.Message) 82 End Try 83 End Sub 84End Class 85

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

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

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

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

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

ozwk

2016/12/07 03:16

ブレークポイントなりコンソール出力なりで`rdata`の内容確認してみてください
MasahikoHirata

2016/12/07 07:26

'Threading.Thread.Sleep'の間、シリアルの受信出来ましたっけ?
goo___

2016/12/08 00:21

rdataの内容を確認してみたところ空になっていました。
goo___

2016/12/08 00:23

Sleepは書き込み用に入れていますがSleepをなしにしても結果は変わりませんでした。
MasahikoHirata

2016/12/08 02:57

rdataが空ということは、’受信’できていない。sleepではなくて、必要なバイト数以上受信できるまでループで待つようにするのが良いのでは?
ozwk

2016/12/09 03:34 編集

専用プロトコルモードとやらのリファレンスありますか?そもそもその電文でなんか応答するのかを確かめたほうがいいのでは?
think.fuku

2016/12/20 08:12

サムチェックコードが足りないです。三菱のシーケンサなら取説に指定例があるので、まず指定例の文字列を書いてみてはどうでしょうか。
hihijiji

2016/12/27 04:16

MX Componentを使う選択肢はないのですか?
guest

回答1

0

ベストアンサー

エラーに関しては
Select Case rdata.Substring(0, 1)
にて、受信データがないのに参照しようとして発生しているのではないでしょうか。
受信内容を解析する前に、rdataにデータが入っているかチェックし、入っていないなら
送信コマンドを再送する等のエラー処理が必要だと思います。

投稿2017/01/14 12:06

YAmaGNZ

総合スコア10258

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問