Что нового

[Сеть, интернет] Modbus TCP опрос прибора

kristow13

Новичок
Сообщения
76
Репутация
0
Версия AutoIt: 3.3.6

Описание:
Есть прибор, он работает по протоколу modbus TCP.
Заводская прога умеет опрашивать этот прибор, но она не сохраняет полученные данные в базе SQL.
Поэтому я хочу написать прогу на autoit для запроса параметров и сохранения их в ms sql.
C работой чтения и записи ms sql я разобрался, все работает.
А вот с протоколом modbus TCP раньше не работал.
Из описания понятно что надо сформировать запросы на чтение из ячеек. Затем получить ответ, посчитать контрольную сумму, и расшифровать полученный ответ. Ну и записать в базу... :whistle:

Я прикрепил протокол обмена прибора http://yadi.sk/d/vXqAOh-GPGGv7. Оттуда я хочу читать текущие показания и архивы из прибора.
Помогите с написанием кода :-[
Спасибо за помощь!

Вот так я хочу выполнять коннект, соединение проходит, но вот не понятно улетает что-то:
Код:
TCPStartup();Инициировать использование службы TCP
$IP = '109.xx.xx.xx';Указываем адрес к которому будем подключаться (Указываю внешний адрес)
$port = 50202;Указываем порт к которому будем подключаться
$socket = TCPConnect($IP, $port);Указыываем ОС создать сокет, подключенный к указанному адресу
$dannie = InputBox('','','');Окно, которое принимает данные для отправки.
;$rez = TCPSend($socket, $dannie);Отправляем данные на сервер
$rez = TCPSend($socket, BinaryToString("00 04 00 00 00 06 00 04 00 70 00 02;"))
If @error <> 0 Then msgbox(0, "Ошибка", "Не удалось отправить данные на сервер")
Sleep(100)
Local $sReceived = TCPRecv($socket, 10) ;we're waiting for the string "toto" OR "tata" (example script TCPSend): 4 bytes length.

    ; Notes: If you don't know how much length will be the data,
    ; use e.g: 2048 for maxlen parameter and call the function until the it returns nothing/error.

    ; Display the string received.
MsgBox(0, "", "Received : " & $sReceived)

TCPCloseSocket($socket);Закрываем сокетc
TCPShutdown();Завершить использование службы TCP
 
Автор
kristow13

kristow13

Новичок
Сообщения
76
Репутация
0
madmasles
оставить эту тему, в этом разделе.
 

unsend

Новичок
Сообщения
27
Репутация
2
Можно было бы заморочиться, но возникает несколько вопросов - что за прибор? Что то улетает - это не очень понятное пояснение:smile: Что выдает при улетании и как это выглядит?:smile: Опять таки писать нечто к неизвестно чему, что неизвестно как тестировать - естественно никто не будет. Можно пообъемнее пояснить что происходит, чего вы конкретно хотите получить и что можете предоставить? Там точно MODBUS, а не MODBUS Plus? Второй протокол закрытый и боюсь если у вас он - можете сразу переходить к варианту вытаскивания данных из заводской софтины - я думаю вряд ли кто то тут сможет (или захочет) корячить закрытый код для сдружения его с мс скулем, разве что вы пообещаете 10 биллионов баксов:smile:
 
Автор
kristow13

kristow13

Новичок
Сообщения
76
Репутация
0
Прибор называется Питерфлоу РС с модулем вывода в Ethernet. Это счетчик воды, который может по modbus RTU выдавать текущей расход и текущее накопленное значение.
Мне необходимо скриптом опрашивать это устройство и полученный ответ от прибора преобразовать в нормальный вид для записи в базу данных.
IP и прогу от производителя для теста могу дать в личном сообщении.

P.S. Протокол обмена устройства: http://termotronic.ru/download/%D0%A0%D0%A1_%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB+%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0+%28%D1%80%D0%B5%D0%B4.1.03%29.pdf?1410941013
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
kristow13
Думаешь кто-то просто так будет разбирать протокол, писать тебе прогу, придумавать нормальный вид для записи в базу, за спасибо?
 
Автор
kristow13

kristow13

Новичок
Сообщения
76
Репутация
0
inververs сказал(а):
kristow13
Думаешь кто-то просто так будет разбирать протокол, писать тебе прогу, придумавать нормальный вид для записи в базу, за спасибо?
Бюджета для данной задачи нету... Но за адекватную помощь "на пиво" :beer: поблагодарю :smile:

Нашел библиотеку по работе с modbus TCP. Вроде то что надо, но я не силен в modbus и не могу дать ладу... http://www.autoit.de/index.php?page=Thread&postID=305467
Код:
#cs ----------------------------------------------------------------------------

	AutoIt Version: 3.3.8.1
	Author:         myName

	Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

#include <modbus.au3>

HotKeySet("{ESC}", "Terminate")

_example_nativ()
_example_libDll()

MsgBox(0, "EXIT", "End of Sample")

Exit


;--------------------------------------------------------------------------------------

Func _example_nativ()
	MsgBox(0, "_example_native()", "Example modbusTCP only via Autoit")
	TCPStartup()

	$_native_ModbusTCP_Debug_Send = 1 
	$_native_ModbusTCP_Debug_Recv = 1

	Global $iSock = TCPConnect("109.188.000.000", 502)

	If $iSock = -1 Then
		ConsoleWrite("Ошибка подключения" & @LF)
		Exit
	EndIf


	$repeat = 5

	While $repeat >= 1

		ConsoleWrite("write" & @CRLF)
		$retval = _native_ModbusTCP_WriteCoils($iSock, 1, 1) ;
		ConsoleWrite("$retval =" & $retval & @CRLF)

		Sleep(100)
		ConsoleWrite("clear" & @CRLF)
		$retval = _native_ModbusTCP_WriteCoils($iSock, 1, 0)
		ConsoleWrite("$retval =" & $retval & @CRLF)

		; oder
		$retval = _native_ModbusTCP_WriteSingleRegister($iSock, 0, 0)
		ConsoleWrite("$retval =" & $retval & @CRLF)


		$aTest = _native_ModbusTCP_ReadImputRegister($iSock, 0, 4, "float") ;Functioncode 4, Register 1, Lдnge 4 Resiter lesen, als float zurьckgeben
		ConsoleWrite("float = " & $aTest[0] & @CRLF)
		$aTest = _native_ModbusTCP_ReadImputRegister($iSock, 0, 1, "word") ;Functioncode 4, Register 1, Lдnge 4 Resiter lesen, als float zurьckgeben
		ConsoleWrite("word = " & $aTest[0] & @CRLF)
		_ArrayDisplay($aTest)

		Global $iRet = _native_ModbusTCP_ReadCoils($iSock, 0, 8);16)
		ConsoleWrite("Bits = " & $iRet & @CRLF)


		$repeat = $repeat - 1

	WEnd

	TCPCloseSocket($iSock)
	TCPShutdown()

EndFunc   ;==>_example_nativ


;--------------------------------------------------------------------------------------------------

Func _example_libDll()
	MsgBox(0, "_example_libDll()", "Example with the libmodbus.dll")

	_Modbus_DllOpen()

	Global $tModbus = _Modbus_New_TCP("172.18.65.159")
	If _Modbus_Connect($tModbus) = -1 Then
		ConsoleWrite("! Fehler: Es konnte keine Verbindung aufgebaut werden." & @CRLF)
		_Modbus_Free($tModbus)
		Exit
	EndIf
	Global $aVal

	$aVal = _Modbus_Set_Debug($tModbus, 1)

	;Global $aVal = _Modbus_Read_Registers($tModbus, 0, 1)
	;Global $aVal = _Modbus_Read_Input_Registers($tModbus, 0, 1)
	;Global $aVal = _Modbus_Read_Input_Bits($tModbus, 5)
	;Global $aVal = _Modbus_Read_Bits($tModbus, 5)
	;Global $aVal = _Modbus_Write_Bit($tModbus, 0, 1 )
	;Global $aVal = _Modbus_Write_Register($tModbus, 0, 8 )


	$repeat = 5

	While $repeat >= 1

		$aVal = _Modbus_Write_Register($tModbus, 0, 1)
		;_ArrayDisplay($aVal)
		;MsgBox(0,"",$aVal)

		Sleep(100)
		$aVal = _Modbus_Write_Register($tModbus, 0, 0)
		;_ArrayDisplay($aVal)
		;MsgBox(0,"",$aVal)

		$aVal = _Modbus_Read_Registers($tModbus, 0, 1)
		_ArrayDisplay($aVal)
		;MsgBox(0,"",$aVal)

		$repeat = $repeat - 1

	WEnd


	_Modbus_Close($tModbus)
	_Modbus_Free($tModbus)

EndFunc   ;==>_example_libDll


Func Terminate()
	Exit 0
EndFunc   ;==>Terminate
 
Верх