Связь с SAG105 METTLER TOLEDO с использованием 9-контактного кабеля LC-RS9 RS232 для IBM PCXT в VB.net

Я пытаюсь закодировать в VB.net SAG105 METTLER TOLEDO, который подключен к компьютеру с помощью 9-контактного кабеля Cable-RS9 RS232 для IBM PCXT. Я исследовал в Интернете, но не смог найти шаблон кода, который может помочь мне отправить данные на устройство весов с использованием VB.net. Я взглянул на код последовательного порта, но, поскольку это RS-232 для IBM PCXT, этот метод последовательного порта не сработал. Я связался с компанией, так как у меня не было никакой документации по масштабированию, к сожалению, они сказали, что у них нет шаблонного кода для устройства.

Может ли кто-нибудь помочь мне начать работу по открытию канала связи и отправке основных команд, направив меня на нужный веб-сайт или поделившись некоторыми своими знаниями. Я провел дни уже на этом и не пошел никуда с этим.

Спасибо заранее

Мне удалось найти достойный код для VB, который работает, однако у меня возникли некоторые проблемы. Поэтому я буду использовать следующие команды: "Z" - установка масштаба на ноль, "SIR" - постоянное чтение нестабильного значения, "S" - получение стабильного значения, "SI" - считывание нестабильного значения один раз.

Однако проблема, с которой я столкнулся, заключается в том, что процедура отправки команды выполняется один раз, а команда приема - дважды. Когда он запускается в первый раз, я получаю правильное значение, но во второй раз я получаю ES (означает синтаксическую ошибку, баланс не распознал команду). Я поставил некоторые перерывы, чтобы увидеть это.

Мой код:

Dim myWeight As String, myWeightValue As Single
Delegate Sub SerialDataIn()
Public myDelegate As SerialDataIn

Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    CloseSerialPort() ' Close the port
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'This opens the serial Port
    OpenSerialPort()
    'Assign the delegate for the Serial Communications handling
    myDelegate = New SerialDataIn(AddressOf SerialDataInProc)
End Sub

'HANDLE SERIAL PORT COMMUNICATIONS IN TO THE PC FROM THE BALANCE:
Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    'Get the weight value string from the balance
    myWeight = SerialPort1.ReadLine
    'Call a new Thread Procedure
    Me.Invoke(myDelegate)
End Sub

'The delegate...
Sub SerialDataInProc()
    'Display the received string in the text box
    Me.TextBox1.Text = myWeight

    'If any string is received that is not prefixed with an 'S' then it is not a weight value, so don't try to process the value
    If myWeight.Substring(0, 1) <> "S" Then GoTo HopIt
    'Convert the string received from the balance into a value
    myWeightValue = Convert.ToSingle(myWeight.Substring(4, 10))
    'If the weight on the balance exceeds 50g then reset the balance (stop data transmission) and display the message "Stopped"
    If myWeightValue > 50 Then
        SerialPortOut("@")
        MsgBox("Stopped")
    End If
HopIt:
End Sub

'Write any command to the balance port
Sub SerialPortOut(ByVal myText)
    Try
        SerialPort1.WriteLine(myText & vbCrLf)
    Catch ex As Exception
        MsgBox("Transmission to Serial Port Failed. Error: " & Err.Description, MsgBoxStyle.Critical, "Comms Failed")
    End Try
End Sub

'Send the Balance the SIR Command (Send current weight value and repeat) if the [SEND SIR] button has been pressed
'Send the @ Command to the balance (Cancels all previous commands, so resets the balance and stops data transmission) if the [Send @] button is clicked
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonReset.Click, ButtonStart.Click
    Select Case sender.name
        Case Is = "ButtonReset"
            SerialPortOut("@")
        Case Is = "ButtonStart"
            SerialPortOut("S")
    End Select
End Sub

'Set the serial Port Parameters and open the Port
Private Sub OpenSerialPort()

    With SerialPort1
        .PortName = "Com1"
        .BaudRate = 9600
        .DataBits = 8
        .Parity = IO.Ports.Parity.None
        .StopBits = IO.Ports.StopBits.One
        .Handshake = IO.Ports.Handshake.XOnXOff
        Try
            .Open()
        Catch ex As Exception
            MsgBox("Could not open the Serial Port! Error: " & Err.Description, MsgBoxStyle.Critical, "Port Error")
        End Try
    End With
End Sub

'Close the Serial Port
Private Sub CloseSerialPort()
    SerialPort1.Close()
End Sub

Может кто-нибудь взглянуть на это и сказать, почему возникает описанная выше проблема?

1 ответ

Протокол для SAG105, по-видимому, является стандартным набором команд интерфейса MT-SICS.

Используя наше программное обеспечение Docklight (даже с бесплатной оценкой), вы легко можете попробовать это на "современном" ПК со стандартным штекером USB-RS-232.

Кажется, что протокол состоит из очень простых текстовых команд, поэтому отправка следующей текстовой команды на SAG105 должна вернуть текущее значение баланса:

I2<CR><LF>

с "CR" = возврат каретки, десятичный код ASCII 13. И "LF" = перевод строки, десятичный код ASCII 10.

Я не смог найти стандартные параметры COM (например, 9600 бод, 8 бит данных, 1 стоп-бит, без контроля четности) для SAGE105, но, возможно, у вас уже есть эта информация, и она может быть в любом случае установлена ​​в настройку для конкретного приложения вашим старое приложение. Если вы знаете настройки RS232, я мог бы выслать вам небольшой пример проекта для Docklight, чтобы вручную поговорить с SAG105.

В.NET такие простые основанные на тексте протоколы должны быть простыми для реализации, как только вы подтвердите правильность настроек и используемых вами протоколов.

Другие вопросы по тегам