4

三菱FX3GPLCのRS232ポートと通信するための通信プロトコルを知っている人はいますか?

三菱とグーグルのサイトを検索しましたが、PLCの特定のレジスタのデータを取得するために送信するコマンドの構文が見つかりませんでした。

しかし、コマンドの次の部分が見つかりました。

  • BR=ビット読み取り
  • BW=ビット書き込み
  • WR=単語の読み取り
  • WW=ワード書き込み

ストレートケーブルとクロスケーブルのどちらを使用するべきか、またどのボーレートで通信する必要があるのか​​(またはデータビット、ストップビット、パリティなどの他の設定)を見つけることができませんでした

FX3G PLCとのRS232通信の経験はありますか?

  • ボーレート(およびその他の通信設定)とは何ですか?
  • コマンドのヘッダーはどのように作成されますか?
  • コマンド自体はどのように構築されていますか?
  • チェックサムはどのように計算されますか?

(どのコーディング言語でも、プロトコルマニュアルでも構いません)

4

2 に答える 2

4

このマニュアルが役に立たないかどうかを確認してください。http://www.automationsystemsandcontrols.net.au/PDF%27s%20Mitsubishi/Manuals/FPLC/FX%20SERIES%20USER%27S%20MANUAL%20-%20Data%20Communication%20Edition .pdfマニュアルのリストは、 http: //www.automationsystemsandcontrols.net.au/Technical%20Mitsubishi.htmlでも入手できます。

于 2012-12-11T17:15:36.597 に答える
3

ここで必要なドキュメントを見つけました

デフォルトの通信設定は、ボーレート 9600、偶数パリティ、7 データ ビット、1 ストップ ビット、およびチェックサムなしです。

これをボーレート 19200、パリティなし、データ ビット 8、ストップ ビット 1、チェックサムをオンに変更しました。

通信パラメータ

小さな VB6 プロジェクト:

'1 form with :
'    1 mscomm control : name=comFX
'    1 command button : name=cmdSend
'    1 textbox        : name=txtShow   multiline=true
Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private mstrData As String
Private mblnBusy As Boolean

Private Sub Form_Load()
  With App
    Caption = .Title & " " & CStr(.Major) & "." & CStr(.Minor) & "." & CStr(.Revision)
  End With 'App
End Sub

Private Sub Form_Resize()
  Dim sngWidth As Single
  Dim sngTxtHeight As Single
  Dim sngCmdWidth As Single, sngCmdHeight As Single
  sngWidth = ScaleWidth
  sngCmdHeight = 315
  sngTxtHeight = ScaleHeight - sngCmdHeight
  txtShow.Move 0, 0, sngWidth, sngTxtHeight
  cmdSend.Move sngCmdWidth, sngTxtHeight, sngWidth, sngCmdHeight
End Sub

Private Sub cmdSend_Click()
  ReadReg "D8013", 7  'sec,min,hr,day,month,year,dayofweek
  ReadReg "R3310", 10 '10 data registers
End Sub

Private Sub ReadReg(strReg As String, intNr As Integer)
  Dim strCmd As String
  If NotBusy Then
    strCmd = "00FFWR0" & strReg & Right$("00" & Hex$(intNr), 2)
    strCmd = Chr$(5) & strCmd & GetSum(strCmd)
    With comFX
      If .PortOpen = False Then CommOpen
      .Output = strCmd
    End With 'comFX
    mblnBusy = True
  End If
End Sub

Private Sub CommOpen()
  With comFX
    If .PortOpen = True Then .PortOpen = False
    .CommPort = 1
    .Settings = "19200,N,8,1"
    .RThreshold = 1
    .PortOpen = True
  End With 'comFX
End Sub

Private Function NotBusy() As Boolean
  Dim lngTimeout As Long
  Dim blnResult As Boolean
  blnResult = True
  lngTimeout = GetTickCount + 1000 'timeout after being busy for 1 second
  Do While mblnBusy
    DoEvents
    If GetTickCount > lngTimeout Then
      blnResult = False
      Exit Do
    End If
  Loop
  NotBusy = blnResult
End Function

Private Sub comFX_OnComm()
  Dim strInput As String
  Select Case comFX.CommEvent
    Case comEvReceive
      strInput = comFX.Input
      mstrData = mstrData & strInput
      ProcessData
  End Select
End Sub

Private Sub ProcessData()
  'answer : ^02 00FF <data registers 4 characters per reg> ^03
  Dim lngStart As Long, lngEnd As Long
  Dim strHead As String, strSum As String
  Dim strEnd As String
  Dim strData As String
  lngStart = InStr(mstrData, Chr$(2))
  If lngStart > 0 Then
    strEnd = Chr$(3)
    lngEnd = InStr(lngStart, mstrData, strEnd)
    If lngEnd > 0 Then
      strHead = Mid$(mstrData, lngStart + 1, 4)
      If strHead = "00FF" Then
        strData = Mid$(mstrData, lngStart + 1, lngEnd - lngStart)
        strSum = Mid$(mstrData, lngEnd + 1, 2)
        If CheckSum(strData, strSum) Then
          mstrData = Mid$(mstrData, lngEnd + 3)
          ShowData Mid$(strData, 5, Len(strData) - 5)
          mblnBusy = False
        End If
      End If
    End If
  End If
End Sub

Private Function CheckSum(strData As String, strSum As String) As Boolean
  If strSum = GetSum(strData) Then
    CheckSum = True
  Else
    CheckSum = False
  End If
End Function

Private Function GetSum(strCmd As String) As String
  Dim intChar As Integer
  Dim lngSum As Long
  lngSum = 0
  For intChar = 1 To Len(strCmd)
    lngSum = lngSum + Asc(Mid$(strCmd, intChar, 1))
  Next intChar
  GetSum = Right$("00" + Hex$(lngSum), 2)
End Function

Private Sub ShowData(strData As String)
  txtShow.SelText = strData & vbCrLf
End Sub

コマンドの送信が速すぎないように注意してください。plcサイクルごとに1回(私の場合は100ミリ秒)が限界のようです。

このコードは VB6 ですが、C# やその他の言語でも同じことが適用できます。C# で例を作成してほしい場合は、私に連絡してください。

于 2012-12-12T11:11:37.223 に答える