How to communication Zelio to Visual Basic?

другие контроллеры
Fence
Posts: 22
Joined: Wed Aug 26, 2009 12:25 am

How to communication Zelio to Visual Basic?

Post by Fence »

Hai.....All..
How to communication Zelio to Visual Basic?
use protocol modbus.
Please help me.

Tank.
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Modbus RTU or Modbus TCP?
Fence
Posts: 22
Joined: Wed Aug 26, 2009 12:25 am

Re: How to communication Zelio to Visual Basic?

Post by Fence »

I use modbus TCP?
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

If use VB6 (VB5),
there are various variants:
1) VB6<->ActiveX WinSOCK<->ModbusTCP on Zelio
2) VB6<->other OLE Automation librarys Winsock TCP/IP <->ModbusTCP on Zelio
3) VB<-> OPC with Modbus TCP Client <-> ModbusTCP on Zelio
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Simple example: read holding registers
1) place ActiveX Winsock with name Winsock1 to Form
2) place CommandButton to Form

VB6<->MS Winsock ActiveX Control<->Modbus TCP on PLC
-----------------------------------------------------------------------------------

Code: Select all

Dim Reg(1 To 10) As Integer ' Values of Variables
Private Sub CloseSocket()
    Winsock1.Close 		'Close Socket
End Sub

Private Sub ConnectSocket()  			'Connect to MODBUS 
    Winsock1.Protocol = sckTCPProtocol   'select ТСР protocol
    Winsock1.Connect "192.168.9.17", 502 'specify ІР and TCPport=502 (Modbus Server)
End Sub

Code: Select all

Private Sub CommandButton3_Click()
    ReadRegisters 0, 5                    ' Read 5 Registers from 0
End Sub

Code: Select all

Sub ReadRegisters(StartAddr As Integer, CountAddr As Integer) ' My function for Read Registers - compose and send message
    Dim a(1 To 12) As Byte 'bytes string for Modbus Message
    If Winsock1.State = sckConnected Then 'if status WinSock is connected
        a(6) = 6 					 'counter bytes
        a(8) = 3					 'function = 3 (Read holding registers)
        a(9) = StartAddr \ 256             'Adsress of first Register - HI
        a(10) = StartAddr Mod 256          'Address of first Register - LO
        a(11) = CountAddr \ 256           'Number(Quantity) Registers
        Winsock1.SendData a               'send Message
    End If
End Sub

Code: Select all

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) ' Responce Message
 Dim a As Variant, LoInd As Integer, i As Integer, j As Integer
 Winsock1.GetData a, , bytesTotal          'get message from buffer
 LoInd = LBound(a)                         'length MEssage of bytes  
 If a(7 + LoInd) = 3 Then 'if function equal 3 (Read holding registers)
    For i = 1 To a(8 + LoInd) \ 2         'for each registers
        j = 9 + (i - 1) * 2               'number bytes in array for each (i) registers
        If (a(j) And &H80) > 0 Then      'if value negative (hi bit=true)
            a(j) = a(j) And &H7F          'set hi bit=false
            Reg(i) = a(j) * 256 + a(j + 1) - 32768 'calculate with sign '
        Else
            Reg(i) = a(j) * 256 + a(j + 1) ' calculate without sign
        End If
    Next
 End If
End Sub
------------------------------------------
Excuse for my English
Fence
Posts: 22
Joined: Wed Aug 26, 2009 12:25 am

Re: How to communication Zelio to Visual Basic?

Post by Fence »

Can you share to me sample program VB and Zelio?

Tank.
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

1) In the top example there are bags (sorry):
Add code for initialize Connection, for Example:

Code: Select all

Private Sub UserForm_Initialize()
    ConnectSocket
End Sub
In sub ReadRegisters Add code

Code: Select all

a(12)=CountAddr Mod 256

Example in VBA Excel:
https://sites.google.com/site/fieldbusb ... ects=0&d=1

2) For ZelioLogic address registers and functions will be others. For Example Holding Registers 32-35 - DATE/TIME... registers. Please read Help for information of Modbus Mapping in Zelio.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

pupena_san, здравствуйте.
У меня к Вам вопросик:
Имеется контроллер ADAM6051, необходимо считывать с него состояния цифровых входов. Допустим с адресом 00008. Это я делаю с помощью VB6.
К нему я законектился:
Connection Script
Show

Code: Select all

Private Sub Command1_Click()
Dim StartTime
If (Winsock1.State <> sckClosed) Then
    Winsock1.Close
End If
Winsock1.Protocol = sckTCPProtocol
Winsock1.Connect "10.61.187.252", 502

StartTime = Timer

Do While ((Timer < StartTime + 2) And (Winsock1.State <> 7))
DoEvents
Loop
If (Winsock1.State <> sckConnecting) Then
   Text1.Text = "Connected"
   Text1.BackColor = &HFF00&
Else
   Text1.Text = "Can't connect to "
   Text1.BackColor = &HFF
End If
End Sub

Private Sub Command2_Click()
If (Winsock1.State <> sckClosed) Then
Winsock1.Close
End If
Do While (Winsock1.State <> sckClosed)
DoEvents
Loop
Text1.Text = "Disconnected"
Text1.BackColor = &HFF
End Sub
А дальше как считывать регистры??? Поясните???
Я выше видел ваш код с пояснениями но по англ не очень понимаю...
заранее спасибо...
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

С функционированием протокола MODBUS Вы знакомы?
Если 00008 это Coils 8, то нужно вместо функции чтения Holding Registers (03) использовать функцию чтение Coils (01), тоесть заполнить массив a другими числами.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Если честно, то совсем плохо.
Я так понял 00008, т.е. 8 ModBus адрес?!
Кстати в описании на ADAM6051 я на картинке еще увидел напротив дискретного входа на кот у меня сидит датчик, вот такое 40015~40016.
Думаю 4 откидываем и получаем 15 и 16, это и есть младший и старший адреса регистра???!!!
Как правильно заполнить массив а если буду все таки использовать ModBus адрес???
И как соответственно потом вытащить что у меня будет на дискретного входе (0 или 1)???
Благодарен что откликнулись....
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Сначала познакомьтесь с азами протокола Modbus, можно тут, можно тут, о особенностях MODBUS/TCP можно тут, тут (также пример на русском) или в оригинале на http://modbus.org/. Когда прийдет понимание сути работы протокола, тогда можно за конкретику браться.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Ну про уровни OSI я вроде норм ознакомлен, а про ModBus конкретно ознакомлюсь.
Одним глазом пробежался по ссылкам хороший материал, только не увидел что значит каждый байт в массиве??! Как прочту все внимательно появится вопросики так что отпишусь позже....
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Спасибо большое за предоставленную информацию. Теперь понятно про 4-ре зоны (области) данных (переменных).
Действительно у меня Coils (начиная с 00001), или область дискретных выходов (выходных битов).
Что касается запроса:
- Код функции: 01 'Чтение Coils
- Адрес начального бита (HI) = 0
- Адрес начального бита (LO) = 8 ' Это если мне нужен дискретный выход 00008 - 8 hex
- Количество бит (HI) = 0
- Количество бит (LO) = 4 ' Это если мне нужны значения еще 4 последующих битов
Теперь это же в VB6:

Code: Select all

Sub ReadRegisters(StartAddr As Integer, CountAddr As Integer) ' My function for Read Registers - compose and send message
    Dim a(1 To 12) As Byte 'bytes string for Modbus Message
    If Winsock1.State = sckConnected Then 'if status WinSock is connected
        a(?) = 1               
        a(?) = 0 \ 256             
        a(?) = 8 Mod 256          
        a(?) = 0 \ 256            
        a(?) = 4 Mod 256          
        Winsock1.SendData a               'send Message
    End If
End Sub
Ответ контроллера должен быть таким (при правильном ответе):
- Код функции = 01
- Счетчик байт = 1 'это в том случае если я анализирую 4 дискретных выхода, значения кот уместятся в одном байте
- Значения битов (первые 8) =
Ответ контроллера в VB6:

Code: Select all

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) 
Dim a As Variant
Winsock1.GetData a, , bytesTotal          'get message from buffer
Text1.Text = a ' чтобы вывести ответ котроллера
End Sub

Code: Select all

Private Sub CommandButton3_Click()
    ReadRegisters 8, 4                    ' считать значения 4 дискретных входа начиная с 00008
End Sub
Посмотрите пожалуйста может где не прав, если несложно поправьте???
Вот что-то с ответом, а точнее с выводом на TextBox в VB6 сомневаюсь правильно ли???
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Тут были?
Назовите функцию лучше ReadCoils, а то потом путаться будете.
При ответе в текстовом боксе будете видеть кракозябрики.
Думаю что при обращении в функции к 8-му биту Вы обратитесь к 000009.
Перед тем как составить запрос, следует отметить один важный момент - регистры (и другие ячейки) в модели MBAP нумеруются с 1-го, а в запросе с 0-го. Это одна из самых запутанных историй, из за которых "танцуют с бубнами" не только новички :-)
Но это надо уточнить в модели устройства.
Проверять лучше сразу на оборудовании. Перед тем как проверить программу на VB советую проверить связь на тестовых программах типа ModbusPoll http://www.modbustools.com/ или подобных. Тогда многие ньюансы будут решены уже на том уровне.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Там был но что то не обратил внимание.
Вообще я подключался к устройству с помощью ModBus OPC Server. И если допустим мне нужно подключиться к дискр выходу DI7 я набирал 00008, в принципе у меня в описании написаны про адреса дискр выходов!!!
Теперь разобрался:

Code: Select all

a(1)=0
a(2)=0
a(3)=0
a(4)=0
a(5)=0
a(6)=6 ' зависит от кол-во последующих байт
a(7)=1 ' адрес устройства, взял 1 п.ч. когда настраивал ModBus OPC Server, то брал адрес устройства=1
a(8)=1 ' код функции ReadCoils
a(9)=0\256
a(10)=8 mod 256
a(9)=0\256
a(10)=4 mod 256
'ВЕРНО???
А что касается текстового бокса, могу я ваш код использовать, чтобы кракозябр не было:

Code: Select all

LoInd = LBound(a)                         'length MEssage of bytes 
If a(7 + LoInd) = 3 Then 'if function equal 3 (Read holding registers)
    For i = 1 To a(8 + LoInd) \ 2         'for each registers
        j = 9 + (i - 1) * 2               'number bytes in array for each (i) registers
        If (a(j) And &H80) > 0 Then      'if value negative (hi bit=true)
            a(j) = a(j) And &H7F          'set hi bit=false
            Reg(i) = a(j) * 256 + a(j + 1) - 32768 'calculate with sign '
        Else
            Reg(i) = a(j) * 256 + a(j + 1) ' calculate without sign
        End If
    Next
End If
Только не увидел куда вы водите ответ от контроллера???
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Числа
a(9)=0
a(10)=8
a(11)=0 (у Вас опечатка)
a(12)=4 (у Вас опечатка)
можно вводить в массив a неспосредственно. В исходном коде предвидена возможность вводить значения адрессов >255, а в Вашем случае байты можно вносить вручную в HI и LO.
В ответе вы ловите биты а не регистры. При правильном ответе Вы должны получить набор битов по 8 штук. Разложите 10-й байт входящего массива (a(10 + LoInd)) побитно или выведите в текстбокс весь байт.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Code: Select all

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim a As Variant
Winsock1.GetData a, , bytesTotal         
Text3.Text = a(10)  
End Sub
что то с байтами не работал и не пойму почему мне не хочет выводить 10 байт, а он вообще в hex выводит???
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Решил посмотреть вообще что-нибудь приходит отнего:

Code: Select all

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim stra As String

Winsock1.GetData stra          'get message from buffer
MsgBox stra  
End Sub
В окне пусто. Неужели он не отвечает??? Вот дела?!
И так еще раз вот полный код:
Show

Code: Select all

Option Explicit
Private Sub Command1_Click()
Dim StartTime
If (Winsock1.State <> sckClosed) Then
    Winsock1.Close
End If
Winsock1.Protocol = sckTCPProtocol
Winsock1.Connect "10.61.187.252", 502

StartTime = Timer

Do While ((Timer < StartTime + 2) And (Winsock1.State <> 7))
DoEvents
Loop
If (Winsock1.State <> sckConnecting) Then
   Text1.Text = "Connected"
   Text1.BackColor = &HFF00&
Else
   Text1.Text = "Can't connect to "
   Text1.BackColor = &HFF
End If
End Sub

Private Sub Command2_Click()
If (Winsock1.State <> sckClosed) Then
Winsock1.Close
End If
Do While (Winsock1.State <> sckClosed)
DoEvents
Loop
Text1.Text = "Disconnected"
Text1.BackColor = &HFF
End Sub

Sub ReadCoils() ' My function for Read Registers - compose and send message
    Dim a(1 To 12) As Byte 'bytes string for Modbus Message
    If Winsock1.State = sckConnected Then 'if status WinSock is connected
        a(1) = 0
        a(2) = 0
        a(3) = 0
        a(4) = 0
        a(5) = 0
        a(6) = 6 ' çàâèñèò îò êîë-âî ïîñëåäóþùèõ áàéò
        a(7) = 1 ' àäðåñ óñòðîéñòâà, âçÿë 1 ï.÷. êîãäà íàñòðàèâàë ModBus OPC Server, òî áðàë àäðåñ óñòðîéñòâà=1
        a(8) = 1 ' êîä ôóíêöèè ReadCoils
        a(9) = 0
        a(10) = 8
        a(11) = 0
        a(12) = 4
        Winsock1.SendData a               'send Message
    End If
End Sub

Private Sub Command3_Click()
    ReadCoils                  ' ñ÷èòàòü çíà÷åíèÿ 4 äèñêðåòíûõ âõîäà íà÷èíàÿ ñ 00008
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim stra As String

Winsock1.GetData stra          'get message from buffer
MsgBox stra  ' ÷òîáû âûâåñòè îòâåò êîòðîëëåðà
End Sub
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Получайте переменную Variant а не String.
Я не знаю, почему у Вас UnitID=1, обычно он=0 или 255. UnitID предназначен для адреса Slave, который подключен к шлюзу Modbus/TCP<->Modbus RTU с заданным IP.
Возьмите для начала за базу мой код, попробуйте прочитать какие-то регистры а потом экспереминтируйте.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Code: Select all

Dim stra As Variant
Взял Variant, все равно пустое окно...
Решил попробовать а(7) = 0, то вообще никакое окно не вылазит, я так полагаю что просто не может прочитать п.ч. UnitID неправильно указан.
Как только а(7) = 1, то окно вылазит но ничего нет.
Мне кажется это все равно показатель что правильно выбран UnitID=1 или я ошибаюсь???
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Попробуйте так

Code: Select all

Dim a As Variant, LoInd As Integer
Winsock1.GetData a, , bytesTotal 
LoInd = LBound(a)   
msgbox a(10 + LoInd)
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Щас попробую
Вот еще решил узнать что нибудь вообще идет от контроллера и поставил Stop (останова) после Winsock1.GetData a, , bytesTotal.
Затем зашел в Locals в меню View и увидел что ответы идут, а именно:
a(0)=0
a(1)=0
a(2)=0
a(3)=0
a(4)=0
a(5)=4
a(6)=1
a(7)=1
a(8)=1
a(9)=63
Пытаюсь теперь все интерпретировать???!!!
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Code: Select all

TransactionID
a(0)=0
a(1)=0

Code: Select all

ProtocolID
a(2)=0
a(3)=0

Code: Select all

Length
a(4)=0
a(5)=4

Code: Select all

UnitID
a(6)=1

Code: Select all

FUNCTIION
a(7)=1

Code: Select all

Счетчик
a(8)=1

Code: Select all

биты в Байте
a(9)=63 - в десятичной системе
в двоичной системе 00111111
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Вот так сделал

Code: Select all

LoInd = LBound(a)
If a(9 + LoInd) = 126 Then
Text3.Text = "На выходе 1"
Else: Text3.Text = "На выходе 0"
End I
f
Так все норм.
Ктати так тоже норм Text3.Text = Val(a(9))
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Да, да понял, не успел отписаться, я в описании прочитал.
Переводить я умею: (pgood)
Только в описании не написано: что каждый бит значит???
Предполагаю что каждый бит отвечает за свой вход. а те кот не опрашиваются 0-ми ("В сообщении-ответе каждое значение переменной передается одним битом, то есть в одном байте пакуется статус 8 битов переменных. Если количество их не кратно восьми, остальные биты в байте заполняются нулями.") заполняются!!
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Все разобрался, кто и что там!!!
Осталось чтобы прога опрашивала постоянно контроллер, а не по команде с кнопки.
Ну хотя бы раз в секунду!!!
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Таймер на форму и вперёд. Но это уже на форуме по VB спрашивайте.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

С таймером я сам в состоянии справиться.
Другой вопрос вот мы анализируем 10 байт. Там 8 бит и каждый можно сказать отвечает за свой выход. Это если их 8 выходов. А если 12, то остальные значения будут в 11 байте отображаться???!!! Так в описании написано. А в ответе 11 байт не приходит!?
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

В запросе надо попросить. Вы же просите 4-ре, приходит наверное 8-мь, попросите 16-ть.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Все верно, если запрашивать больше 8, то приходит 11 байт и.т.д.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Спасибо, Вам. Я думаю тема разобрана хорошо и иссякла себя!!!
Если не секрет, а вы с какими контроллерами работали, чтобы на будущее знать!!!???
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Tehnik55 wrote:Если не секрет, а вы с какими контроллерами работали, чтобы на будущее знать!!!???
Тут люди работают с разными контроллерами. Так что задавайте вопросы в новых ветвях, думаю Вам ответят.
Tehnik55
Posts: 17
Joined: Sat Jul 21, 2012 4:23 am

Re: How to communication Zelio to Visual Basic?

Post by Tehnik55 »

Проблемка возникла. Может тоже сталкивались?!
На одном буке (W7) зпускаю прогу все норм работает. Делаю EXE все пашет.
Притаскиваю тот же EXE на другой комп (XP). Выкатывает ошибку: Component 'MSWINSCK.ocx' or one
of its dependencies not correctly registered: a file is missing or invalid. Что то типа компонент не правильно зарегистрирован...
Попробовал принести сам код и запустить, все хорошо. Как делаю EXE снова таже ошибка!!!
Может дело в том, что разные системы(W7 продвинутая)???!!!
Подскажите как решить эту проблемку!!!???
Кстате потом на Wista пытался EXE запустить, снова ошибка...
pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев

Re: How to communication Zelio to Visual Basic?

Post by pupena_san »

Это к гуру по VB. Очевидно библиотека с ActiveX WinSock на компе не зарегистрирована. Где-то уже о подобной проблеме на форуме проскакивало, либо на этом либо на http://iadt.siemens.ru/forum/. По моему библиотека ставится вместе с VisualStudio. Попробуйте перенести на комп библиотеку в system32 и с командной строки запустить

Code: Select all

regsvr32 название_файла_с_полным_путём
может так получится.