Thread - Close !
Beiträge von vivus
-
-
Hi @ all !
Ich hab hier ein kleines Paket Zusammengeschnürt um Via AutoIt das Modbus Protokoll zu verwenden. Und somit unzählige Hardware Anzusprechen.
Enthalten sind:
meine UDF
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include-Once
; #INDEX# =======================================================================================================================
; Title .........: libmodbus
; AutoIt Version : 3.2.10++
; Language ......: English/German
; Description ...: Functions for Handling the http://libmodbus.org/ dll
; the "_nativ" Funktions Handels the ModbusTCP ONLY VIA AutoIT !! -> you need no modbus.dll for those Funktions
; Author(s) .....: vivus ( Marc Neininger ), funkey,
; The libmodbus documentation was written by Stéphane Raimbault <[email='stephane.raimbault@gmail.com'][/email]>
; ===============================================================================================================================; #CURRENT# =====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
;>"_native" ( dll not needed )
;_native_ModbusTCP_ReadImputRegister($mainsocket, $iStart, $iNum, $sType)
;_native_ModbusTCP_ReadCoils($mainsocket, $iStartAddress, $iNumOfCoils)
;_native_ModbusTCP_WriteCoils($mainsocket, $Port_adress , $Hi_Lo)
;_native_ModbusTCP_WriteSingleRegister($mainsocket, $iStartAddress, $iNumOfCoils);----------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]
;>"_Madbus" ( libmodbus.dll from libmodbus.org needed )
;_Modbus_SetDllPath($sFullPath)
;_Modbus_DllOpen()
;_Modbus_New_TCP($sIP, $iPort = 502)
;_Modbus_Connect($tModbus)
;_Modbus_Close($tModbus)
;_Modbus_Free($tModbus)
;_Modbus_StrError($iError)
;_Modbus_Read_Registers($tModbus, $iAddr, $iNum)
;_Modbus_Read_Input_Registers($tModbus, $iAddr, $iNum)
;_Modbus_Read_Input_Bits($tModbus, $iAddr, $iNum = 1)
;_Modbus_Read_Bits($tModbus, $iAddr, $iNum = 1 ) ( offiziell Read Coil )
;_Modbus_Write_Bit($tModbus, $iAddr, $status )
;_Modbus_Write_Register($tModbus, $iAddr, $Value)
;_Modbus_Write_Bits($tModbus, $iAddr, $iNum) ( write many bits / Multible Coil )
;_Modbus_Set_Debug($tModbus, $boolean)
; ===============================================================================================================================; #INTERNAL_USE_ONLY# ===========================================================================================================
[/autoit] [autoit][/autoit] [autoit]
;>"_native" ( dll not needed )
;__Convert_To_Binary($iNumber)
;__WinAPI_Int64ToDouble($iInt64)
;__ModbusTCP_Recv($mainsocket, $maxlen = 256, $flag = 0)
;__ModbusTCP_Send($mainsocket, $data)
;----------------------------------------------------
;
; ===============================================================================================================================#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>Const $_sUDFVersion = 'V1.0'
[/autoit] [autoit][/autoit] [autoit]
;Global $_mgdebug = False;###################################################################################################################################
[/autoit] [autoit][/autoit] [autoit]
;###################################################################################################################################
;###################################################################################################################################
;###################################################################################################################################
;###################################################################################################################################
;>"_nativ" ( dll not needed )
Global $_native_ModbusTCP_Debug_Send = 0 ; if = 1 you can see the modbus send-Protokoll on CMD-line ( only _native )
Global $_native_ModbusTCP_Debug_Recv = 0 ; if = 1 you can see the modbus recv-Protokoll on CMD-line ( only _native )
Global $__TID=0 ; ONLY INTERNAL USE !! contains the transmission ID of the last _native_Modbus CALL !!; #Simple-Sample# for >"_nativ" ModbusTCP( dll not needed ) ========================================================================
[/autoit] [autoit][/autoit] [autoit]
#csFunc _example_nativ()
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "_example_native()", "Example modbusTCP only via Autoit")
TCPStartup()$_native_ModbusTCP_Debug_Send = 1
[/autoit] [autoit][/autoit] [autoit]
$_native_ModbusTCP_Debug_Recv = 1Global $iSock = TCPConnect("172.18.65.159", 502)
[/autoit] [autoit][/autoit] [autoit]If $iSock = -1 Then
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("Fehler Verbindungsaufbau" & @LF)
Exit
EndIf$repeat = 5
[/autoit] [autoit][/autoit] [autoit]While $repeat >= 1
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite("write" & @CRLF)
[/autoit] [autoit][/autoit] [autoit]
$retval = _native_ModbusTCP_WriteCoils($iSock, 1, 1) ;
ConsoleWrite("$retval =" & $retval & @CRLF)Sleep(100)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("clear" & @CRLF)
$retval = _native_ModbusTCP_WriteCoils($iSock, 1, 0)
ConsoleWrite("$retval =" & $retval & @CRLF); oder
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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
[/autoit] [autoit][/autoit] [autoit]
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)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("Bits = " & $iRet & @CRLF)$repeat = $repeat - 1
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit]TCPCloseSocket($iSock)
[/autoit] [autoit][/autoit] [autoit]
TCPShutdown()EndFunc ;==>_example_nativ
[/autoit] [autoit][/autoit] [autoit]
#ce
; ===============================================================================================================================Func _native_ModbusTCP_ReadImputRegister($mainsocket, $iStart, $iNum, $sType)
[/autoit] [autoit][/autoit] [autoit]$__TID += 1
[/autoit] [autoit][/autoit] [autoit]Local $iBytesToSend = 6
[/autoit] [autoit][/autoit] [autoit]
Local $FC = "04"__ModbusTCP_Send($mainsocket, "0x" & Hex($__TID, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & Hex($FC, 2) & Hex($iStart, 4) & Hex($iNum, 4))
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(1, 0, 0)Local $sRecv
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit]
$sRecv = __ModbusTCP_Recv($mainsocket, 512)Until @error Or $sRecv <> ""
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(2, 0, 0)If Int(String(BinaryMid($sRecv, 1, 2))) <> $__TID Then Return SetError(3, 0, 0)
[/autoit] [autoit][/autoit] [autoit];ConsoleWrite("$sRecv"&$sRecv&@CRLF)
[/autoit] [autoit][/autoit] [autoit]Local $iSize = 4 ; default
[/autoit] [autoit][/autoit] [autoit]Switch $sType
[/autoit] [autoit][/autoit] [autoit]
Case "word"
$iSize = 2
Case "float"
$iSize = 4
Case "double"
$iSize = 8
EndSwitchLocal $aRet[$iNum / ($iSize / 2)], $iTemp
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To UBound($aRet) - 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$iTemp = BinaryMid($sRecv, 10 + $i * $iSize, $iSize)
Switch $sType
Case "word"
$aRet[$i] = Int(String($iTemp))
Case "float"
$aRet[$i] = _WinAPI_IntToFloat(Int(String($iTemp)))
Case "double"
$aRet[$i] = __WinAPI_Int64ToDouble(Int(String($iTemp)))
EndSwitch
Next
Return $aRet
EndFunc ;==>_ModbusTCP_ReadValuesFunc _native_ModbusTCP_ReadCoils($mainsocket, $iStartAddress, $iNumOfCoils)
[/autoit] [autoit][/autoit] [autoit]$__TID += 1
[/autoit] [autoit][/autoit] [autoit]Local $iBytesToSend = 6, $iFunctionCode = "02"
[/autoit] [autoit][/autoit] [autoit]If $iNumOfCoils < 1 Then Return SetError(1, 0, 0)
[/autoit] [autoit][/autoit] [autoit]__ModbusTCP_Send($mainsocket, "0x" & Hex($__TID, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($iStartAddress, 4) & Hex($iNumOfCoils, 4))
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(2, 0, 0)Local $sRecv
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit]
$sRecv = __ModbusTCP_Recv($mainsocket, 512)
Until @error Or $sRecv <> ""
If @error Then Return SetError(3, 0, 0)If Int(String(BinaryMid($sRecv, 1, 2))) <> $__TID Then Return SetError(4, 0, 0)
[/autoit] [autoit][/autoit] [autoit]Local $iAnzahlBytes = Int(String(BinaryMid($sRecv, 9, 1)))
[/autoit] [autoit][/autoit] [autoit];ConsoleWrite("Anzahl der erhaltenen Daten: " & $iAnzahlBytes & " Byte(s), max " & $iAnzahlBytes * 8 & " Bits." & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Return __Convert_To_Binary(Int(String(BinaryMid($sRecv, 10, $iAnzahlBytes))))
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_ModbusTCP_ReadCoils;--------------------------------------------------------------------------------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]Func _native_ModbusTCP_WriteCoils($mainsocket, $Port_adress , $Hi_Lo)
[/autoit] [autoit][/autoit] [autoit]$__TID += 1
[/autoit] [autoit][/autoit] [autoit]Local $iBytesToSend = 6, $iFunctionCode = "05"
[/autoit] [autoit][/autoit] [autoit]If $Port_adress < 1 Then Return SetError(1, 0, 0)
[/autoit] [autoit][/autoit] [autoit]If $Hi_Lo = 1 then
[/autoit] [autoit][/autoit] [autoit]
__ModbusTCP_Send($mainsocket, "0x" & Hex($__TID, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($Port_adress-1, 4) & "FF00"); 65280 = FF00ElseIf $Hi_Lo = 0 then
[/autoit] [autoit][/autoit] [autoit]
__ModbusTCP_Send($mainsocket, "0x" & Hex($__TID, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($Port_adress-1, 4) & "0000")Else
[/autoit] [autoit][/autoit] [autoit]
;If $iNumOfCoils < 1 Then Return SetError(1, 0, 0)
Return SetError(1, 0, 0)
;_ModbusTCP_Send($mainsocket, "0x" & Hex($__TID, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($iStartAddress, 4) & Hex($iNumOfCoils, 4))EndIf
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(2, 0, 0)Local $sRecv
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit]
$sRecv = __ModbusTCP_Recv($mainsocket, 512)
Until @error Or $sRecv <> ""
If @error Then Return SetError(3, 0, 0)If Int(String(BinaryMid($sRecv, 1, 2))) <> $__TID Then Return SetError(4, 0, 0)
[/autoit] [autoit][/autoit] [autoit];Local $iAnzahlBytes = Int(String(BinaryMid($sRecv, 9, 1)))
[/autoit] [autoit][/autoit] [autoit];ConsoleWrite("Anzahl der erhaltenen Daten: " & $iAnzahlBytes & " Byte(s), max " & $iAnzahlBytes * 8 & " Bits." & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Return 1 ;_Convert_To_Binary(Int(String(BinaryMid($sRecv, 10, $iAnzahlBytes))))
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_ModbusTCP_ReadCoils
[/autoit] [autoit][/autoit] [autoit];--------------------------------------------------------------------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]Func _native_ModbusTCP_WriteSingleRegister($mainsocket, $iStartAddress, $iNumOfCoils)
[/autoit] [autoit][/autoit] [autoit]$__TID += 1
[/autoit] [autoit][/autoit] [autoit]Local $iBytesToSend = 6, $iFunctionCode = "06"
[/autoit] [autoit][/autoit] [autoit]If $iNumOfCoils < 0 Then
[/autoit] [autoit][/autoit] [autoit]
Return SetError(1, 0, 0)
EndIf__ModbusTCP_Send($mainsocket, "0x" & Hex($__TID, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($iStartAddress, 4) & Hex($iNumOfCoils, 4))
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(2, 0, 0)Local $sRecv
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit]
$sRecv = __ModbusTCP_Recv($mainsocket, 512)
Until @error Or $sRecv <> ""
If @error Then Return SetError(3, 0, 0)If Int(String(BinaryMid($sRecv, 1, 2))) <> $__TID Then Return SetError(4, 0, 0)
[/autoit] [autoit][/autoit] [autoit];Local $iAnzahlBytes = Int(String(BinaryMid($sRecv, 9, 1)))
[/autoit] [autoit][/autoit] [autoit];ConsoleWrite("Anzahl der erhaltenen Daten: " & $iAnzahlBytes & " Byte(s), max " & $iAnzahlBytes * 8 & " Bits." & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Return 1;_Convert_To_Binary(Int(String(BinaryMid($sRecv, 10, $iAnzahlBytes))))
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_ModbusTCP_ReadCoilsFunc __ModbusTCP_Send($mainsocket, $data)
[/autoit] [autoit][/autoit] [autoit]
If $_native_ModbusTCP_Debug_Send Then ConsoleWrite("_native_ModbusTCP_Send(" & $mainsocket & ", """ & $data & """)" & @CRLF)
Local $Send = TCPSend($mainsocket, $data)
Return SetError(@error, 0, $Send)
EndFunc ;==>_ModbusTCP_SendFunc __ModbusTCP_Recv($mainsocket, $maxlen = 256, $flag = 0)
[/autoit] [autoit][/autoit] [autoit]
Local $sRecv = TCPRecv($mainsocket, $maxlen, $flag)
Local $error = @error
If $sRecv <> "" And $_native_ModbusTCP_Debug_Recv Then ConsoleWrite("_native_ModbusTCP_Recv: " & $sRecv & @CRLF)
Return SetError($error, 0, $sRecv)
EndFunc ;==>_ModbusTCP_Recv; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: __WinAPI_Int64ToDouble
; Description ...: Returns a 8 byte integer as a double value
; Syntax.........: __WinAPI_IntToFloat($iInt64)
; Parameters ....: $iInt64 - 8 byte Integer value (64 bit)
; Return values .: Success - 8 byte integer value as a double
; Author ........: funkey
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: Yes
; ===============================================================================================================================
Func __WinAPI_Int64ToDouble($iInt64)
Local $__TIDnt64 = DllStructCreate("INT64")
Local $tDouble = DllStructCreate("double", DllStructGetPtr($__TIDnt64))
DllStructSetData($__TIDnt64, 1, $iInt64)
Return DllStructGetData($tDouble, 1)
EndFunc ;==>_WinAPI_Int64ToDoubleFunc __Convert_To_Binary($iNumber)
[/autoit] [autoit][/autoit] [autoit]
Local $sBinString = ""
Do
$sBinString = BitAND($iNumber, 1) & $sBinString
$iNumber = BitShift($iNumber, 1)
Until $iNumber <= 0
If $iNumber < 0 Then SetError(1, 0, 0)
Return $sBinString
EndFunc ;==>_Convert_To_Binary; END -> ;>"_nativ" ( dll not needed )
[/autoit] [autoit][/autoit] [autoit];###################################################################################################################################
[/autoit] [autoit][/autoit] [autoit]
;###################################################################################################################################
;###################################################################################################################################
;###################################################################################################################################
;###################################################################################################################################
;>"_Madbus" ( libmodbus.dll from libmodbus.org needed )Global $hDLL_Modbus = 0
[/autoit] [autoit][/autoit] [autoit]
Global $__DLLNAME = 'libModbus.dll'; #Simple-Sample# for libmodbus.dll ================================================================================================
[/autoit] [autoit][/autoit] [autoit]
#cs
Func _example_libDll()
MsgBox(0, "_example_libDll()", "Example with the libmodbus.dll")_Modbus_DllOpen()
[/autoit] [autoit][/autoit] [autoit]Global $tModbus = _Modbus_New_TCP("172.18.65.159")
[/autoit] [autoit][/autoit] [autoit]
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)
[/autoit] [autoit][/autoit] [autoit];Global $aVal = _Modbus_Read_Registers($tModbus, 0, 1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;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
[/autoit] [autoit][/autoit] [autoit]While $repeat >= 1
[/autoit] [autoit][/autoit] [autoit]$aVal = _Modbus_Write_Register($tModbus, 0, 1)
[/autoit] [autoit][/autoit] [autoit]
;_ArrayDisplay($aVal)
;MsgBox(0,"",$aVal)Sleep(100)
[/autoit] [autoit][/autoit] [autoit]
$aVal = _Modbus_Write_Register($tModbus, 0, 0)
;_ArrayDisplay($aVal)
;MsgBox(0,"",$aVal)$aVal = _Modbus_Read_Registers($tModbus, 0, 1)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aVal)
;MsgBox(0,"",$aVal)$repeat = $repeat - 1
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]_Modbus_Close($tModbus)
[/autoit] [autoit][/autoit] [autoit]
_Modbus_Free($tModbus)EndFunc ;==>_example_libDll
[/autoit] [autoit][/autoit] [autoit]
#ce
; ===============================================================================================================================;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _Modbus_SetDllPath($sFullPath)
; Description: Sets full path to th extdll so that it can be in any location.
; Parameters: $sFullPath - Full path to the libmodbus.dll e.g. "C:\libmodbus\libmodbus.dll"
; Returns; on success 1
; on error -1 if full path does not exist
;===============================================================================
Func _Modbus_SetDllPath($sFullPath)
If Not FileExists($sFullPath) Then Return -1$__DLLNAME = $sFullPath
[/autoit] [autoit][/autoit] [autoit]
Return 1EndFunc ;==>_CommSetDllPath
[/autoit] [autoit][/autoit] [autoit];===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _Modbus_DllOpen()
; Description: Start the Connection to the libmodbus dll
; Parameters:
; Returns; on success 1
; on error -1
;===============================================================================
Func _Modbus_DllOpen()
$hDLL_Modbus = DllOpen($__DLLNAME)
If $hDLL_Modbus = -1 Then
SetError(1)
$sErr = 'Failed to open DLL'
Return 0;failed
EndIfreturn 1
[/autoit] [autoit][/autoit] [autoit]
EndFunc; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_New_TCP
; Description ...: The modbus_new_tcp() function shall allocate and initialize a modbus_t structure to communicate with a Modbus TCP/IPv4 server.
; Syntax.........: _Modbus_New_TCP($sIP, $iPort = 502)
; Parameters ....: The ip argument specifies the IP address of the server to which the client wants etablish a connection.
; The port argument is the TCP port to use. Set the port to MODBUS_TCP_DEFAULT_PORT to use the default one (502). It’s convenient to use a port number greater than or equal to 1024 because it’s not necessary to have administrator privileges.
; Return values .: The modbus_new_tcp() function shall return a pointer to a modbus_t structure if successful. Otherwise it shall return NULL and set errno to one of the values defined below.
; Failure EINVAL An invalid IP address was given.
; C-Syntax.......: modbus_t *modbus_new_tcp(const char *ip, int port);
; ===============================================================================================================================
Func _Modbus_New_TCP($sIP, $iPort = 502)
Local $aRet = DllCall($hDLL_Modbus, "ptr:cdecl", "modbus_new_tcp", "str", $sIP, "int", $iPort)
Return $aRet[0]
EndFunc ;==>_Modbus_New_TCP; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Connect
; Description ...: The modbus_connect() function shall etablish a connection to a Modbus server, a network or a bus using the context information of libmodbus context given in argument.
; Syntax.........: _Modbus_Connect($tModbus)
; Parameters ....: The $tModbus handle
; Return values .: The modbus_connect() function shall return 0 if successful. Otherwise it shall return -1 and set errno to one of the values defined by the system calls of the underlying platform.
; C-Syntax.......: int modbus_connect(modbus_t *ctx);
; ===============================================================================================================================
Func _Modbus_Connect($tModbus)
Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_connect", "ptr", $tModbus)
Return $aRet[0]
EndFunc ;==>_Modbus_Connect; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Close
; Description ...: The modbus_close() function shall close the connection established with the backend set in the context.
; Syntax.........: _Modbus_Close($tModbus)
; Parameters ....: The $tModbus handle
; Return values .: There is no return value.
; C-Syntax.......: void modbus_close(modbus_t *ctx);
; ===============================================================================================================================
Func _Modbus_Close($tModbus)
DllCall($hDLL_Modbus, "none:cdecl", "modbus_close", "ptr", $tModbus)
EndFunc ;==>_Modbus_Close; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Free
; Description ...: The modbus_free() function shall free an allocated modbus_t structure.
; Syntax.........: _Modbus_Free($tModbus)
; Parameters ....: The $tModbus handle
; Return values .: There is no return value.
; C-Syntax.......: void modbus_free(modbus_t *ctx);
; ===============================================================================================================================
Func _Modbus_Free($tModbus)
DllCall($hDLL_Modbus, "none:cdecl", "modbus_free", "ptr", $tModbus)
EndFunc ;==>_Modbus_Free; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_StrError
; Description ...: The modbus_strerror() function shall return a pointer to an error message string corresponding to the error number specified by the errnum argument. As libmodbus defines additional error numbers over and above those defined by the
; operating system, applications should use modbus_strerror() in preference to the standard strerror() function.
; Syntax.........: _Modbus_StrError($iError)
; Parameters ....: the Error number
; Return values .: The modbus_strerror() function shall return a pointer to an error message string.
; C-Syntax.......: const char *modbus_strerror(*int errnum);
; ===============================================================================================================================
Func _Modbus_StrError($iError)
Local $aRet = DllCall($hDLL_Modbus, "str:cdecl", "modbus_strerror", "int", $iError)
Return $aRet[0]
EndFunc ;==>_Modbus_StrError; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Read_Registers
; Description ...: The modbus_read_registers() function shall read the content of the nb holding registers to the address addr of the remote device. The result of reading is stored in dest array as word values (16 bits).
; You must take care to allocate enough memory to store the results in dest (at least nb * sizeof(uint16_t)).
; The function uses the Modbus function code 0x03 (read holding registers).
; Syntax.........: _Modbus_Read_Registers($tModbus, $iAddr, $iNum)
; Parameters ....: nb holding registers
; addr of the remote device
; Return values .: The modbus_read_registers() function shall return the number of read registers if successful. Otherwise it shall return -1 and set errno.
; C-Syntax.......: int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
; ===============================================================================================================================
Func _Modbus_Read_Registers($tModbus, $iAddr, $iNum)
Local $tBuffer = DllStructCreate("WORD[" & $iNum & "]")
Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_read_registers", "ptr", $tModbus, "int", $iAddr, "int", $iNum, "struct*", $tBuffer)Local $aRes[$iNum]
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iNum - 1
$aRes[$i] = DllStructGetData($tBuffer, 1, $i + 1)
Next
Return $aRes
EndFunc ;==>_Modbus_Read_Registers; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Read_Input_Registers
; Description ...: The modbus_read_input_registers() function shall read the content of the nb input registers to address addr of the remote device. The result of the reading is stored in dest array as word values (16 bits).
; You must take care to allocate enough memory to store the results in dest (at least nb * sizeof(uint16_t)).
; The function uses the Modbus function code 0x04 (read input registers). The holding registers and input registers have different historical meaning, but nowadays it’s more common to use holding registers only.
; Syntax.........: _Modbus_Read_Input_Registers($tModbus, $iAddr, $iNum)
; Parameters ....: nb holding registers
; addr of the remote device
; Return values .: The modbus_read_input_registers() function shall return the number of read input registers if successful. Otherwise it shall return -1 and set errno.
; C-Syntax.......: int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
; ===============================================================================================================================
Func _Modbus_Read_Input_Registers($tModbus, $iAddr, $iNum)
Local $tBuffer = DllStructCreate("WORD[" & $iNum & "]")
Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_read_input_registers", "ptr", $tModbus, "int", $iAddr, "int", $iNum, "struct*", $tBuffer)Local $aRes[$iNum]
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iNum - 1
$aRes[$i] = DllStructGetData($tBuffer, 1, $i + 1)
Next
Return $aRes
EndFunc ;==>_Modbus_Read_Input_Registers; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Read_Input_Bits
; Description ...: The modbus_read_input_bits() function shall read the content of the nb input bits to the address addr of the remote device. The result of reading is stored in dest array as unsigned bytes (8 bits) set to TRUE or FALSE.
; You must take care to allocate enough memory to store the results in dest (at least nb * sizeof(uint8_t)).
; The function uses the Modbus function code 0x02 (read input status).
; Syntax.........: _Modbus_Read_Input_Bits($tModbus, $iAddr, $iNum)
; Parameters ....: nb holding registers
; addr of the remote device
; Return values .: The modbus_read_input_status() function shall return the number of read input status if successful. Otherwise it shall return -1 and set errno.
; C-Syntax.......: int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
; ===============================================================================================================================
Func _Modbus_Read_Input_Bits($tModbus, $iAddr, $iNum = 1)
Local $tBuffer = DllStructCreate("WORD[" & $iNum & "]")
Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_read_input_bits", "ptr", $tModbus, "int", $iAddr, "int", $iNum, "struct*", $tBuffer)Local $aRes[$iNum]
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iNum - 1
$aRes[$i] = DllStructGetData($tBuffer, 1, $i + 1)
NextIf $iNum = 1 Then
[/autoit] [autoit][/autoit] [autoit]
Return $aRes[0]
Else
Return $aRes
EndIf
EndFunc ;==>_Modbus_Read_Input_Bits; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Read_Bits ( offiziell Read Coil )
; Description ...: The modbus_read_bits() function shall read the status of the nb bits (coils) to the address addr of the remote device. The result of reading is stored in dest array as unsigned bytes (8 bits) set to TRUE or FALSE.
; You must take care to allocate enough memory to store the results in dest (at least nb * sizeof(uint8_t)).
; The function uses the Modbus function code 0x01 (read coil status).
; Syntax.........: _Modbus_Read_Bits($tModbus, $iAddr, $iNum = 1 )
; Parameters ....: nb holding registers
; addr of the remote device
; Return values .: The modbus_read_bits() function shall return the number of read bits if successful. Otherwise it shall return -1 and set errno.
; C-Syntax.......: int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
; ===============================================================================================================================
Func _Modbus_Read_Bits($tModbus, $iAddr, $iNum = 1)
Local $tBuffer = DllStructCreate("WORD[" & $iNum & "]")
Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_read_bits", "ptr", $tModbus, "int", $iAddr, "int", $iNum, "struct*", $tBuffer)Local $aRes[$iNum]
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iNum - 1
$aRes[$i] = DllStructGetData($tBuffer, 1, $i + 1)
NextIf $iNum = 1 Then
[/autoit] [autoit][/autoit] [autoit]
Return $aRes[0]
Else
Return $aRes
EndIf
EndFunc ;==>_Modbus_Read_Bits; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Write_Bit ( write a single bit )
; Description ...: The modbus_write_bit() function shall write the status of status at the address addr of the remote device. The value must be set to TRUE or FALSE.
; The function uses the Modbus function code 0x05 (force single coil).
; Syntax.........: _Modbus_Write_Bit($tModbus, $iAddr, $status )
; Parameters ....: addr of the remote device
; $status - True False
; Return values .: The modbus_write_bit() function shall return 1 if successful. Otherwise it shall return -1 and set errno.
; C-Syntax.......: int modbus_write_bit(modbus_t *ctx, int addr, int status);
; ===============================================================================================================================
Func _Modbus_Write_Bit($tModbus, $iAddr, $status)
;Local $tBuffer = DllStructCreate("WORD[" & $iNum & "]")
Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_write_bit", "ptr", $tModbus, "int", $iAddr, "int", $status);, "struct*", $tBuffer)If (UBound($aRet)) >= 4 Then
[/autoit] [autoit][/autoit] [autoit]
If $aRet[3] = $status Then
Return 1
Else
Return -1
EndIf
EndIf
Return -1EndFunc ;==>_Modbus_Write_Bit
[/autoit] [autoit][/autoit] [autoit]; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Write_Register ( write a single register )
; Description ...: The modbus_write_register() function shall write the value of value holding registers at the address addr of the remote device.
; The function uses the Modbus function code 0x06 (preset single register).
; Syntax.........: _Modbus_Write_Register($tModbus, $iAddr, $Value)
; Parameters ....: addr of the remote device
; $status - True False
; Return values .: The modbus_write_register() function shall return 1 if successful. Otherwise it shall return -1 and set errno.
; C-Syntax.......: int modbus_write_register(modbus_t *ctx, int addr, int value);
; ===============================================================================================================================
Func _Modbus_Write_Register($tModbus, $iAddr, $Value)Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_write_register", "ptr", $tModbus, "int", $iAddr, "int", $Value)
[/autoit] [autoit][/autoit] [autoit]If (UBound($aRet)) >= 4 Then
[/autoit] [autoit][/autoit] [autoit]
If $aRet[3] = $Value Then
Return 1
Else
Return -1
EndIf
EndIfReturn -1
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Modbus_Write_Register
[/autoit] [autoit][/autoit] [autoit]; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Modbus_Set_Debug ( set debug flag of the context)
; Description ...: The modbus_set_debug() function shall set the debug flag of the modbus_t context by using the argument boolean. When the boolean value is set to TRUE, many verbose messages are displayed on stdout and stderr. For example, this
; flag is useful to display the bytes of the Modbus messages.
; [00][14][00][00][00][06][12][03][00][6B][00][03]
; Waiting for a confirmation…
; <00><14><00><00><00><09><12><03><06><02><2B><00><00><00><00>
; Syntax.........: _Modbus_Set_Debug($tModbus, $boolean)
; Parameters ....: When the boolean value is set to TRUE many verbose messages are displayed on stdout and stderr
;
; Return values .: There is no return values.
; C-Syntax.......: void modbus_set_debug(modbus_t *ctx, int boolean);
; ===============================================================================================================================
Func _Modbus_Set_Debug($tModbus, $boolean)Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_set_debug", "ptr", $tModbus, "int", $boolean)
[/autoit] [autoit][/autoit] [autoit]Return $aRet
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Modbus_Write_Register
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]#cs
[/autoit] [autoit][/autoit] [autoit]
; #FUNCTION# ====================================================================================================================
; Name...........: _Modbus_Write_Bits ( write many bits / Multible Coil )
; Description ...: The modbus_write_bits() function shall write the status of the nb bits (coils) from src at the address addr of the remote device. The src array must contains bytes set to TRUE or FALSE.
; The function uses the Modbus function code 0x0F (force multiple coils).
; Syntax.........: _Modbus_Write_Bits($tModbus, $iAddr, $iNum)
; Parameters ....: addr of the remote device
; status of the nb bits (coils)
; src - quelle
; Return values .: The modbus_write_bits() function shall return the number of written bits if successful. Otherwise it shall return -1 and set errno.
; C-Syntax.......: int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *src);
; ===============================================================================================================================
Func _Modbus_Write_Bits($tModbus, $iAddr, $iNum)
Local $tBuffer = DllStructCreate("WORD[" & $iNum & "]")
Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_read_registers", "ptr", $tModbus, "int", $iAddr, "int", $iNum, "struct*", $tBuffer)Local $aRes[$iNum]
[/autoit]
For $i = 0 To $iNum - 1
$aRes[$i] = DllStructGetData($tBuffer, 1, $i + 1)
Next
Return $aRes
EndFunc ;==>_Modbus_Read_Registers
#cedas Simple_Sample
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#cs ----------------------------------------------------------------------------AutoIt Version: 3.3.8.1
[/autoit] [autoit][/autoit] [autoit]
Author: myNameScript Function:
[/autoit] [autoit][/autoit] [autoit]
Template AutoIt script.#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]#include <modbus.au3>
[/autoit] [autoit][/autoit] [autoit]HotKeySet("{ESC}", "Terminate")
[/autoit] [autoit][/autoit] [autoit]_example_nativ()
[/autoit] [autoit][/autoit] [autoit]
_example_libDll()MsgBox(0, "EXIT", "End of Sample")
[/autoit] [autoit][/autoit] [autoit]Exit
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];--------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]Func _example_nativ()
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "_example_native()", "Example modbusTCP only via Autoit")
TCPStartup()$_native_ModbusTCP_Debug_Send = 1
[/autoit] [autoit][/autoit] [autoit]
$_native_ModbusTCP_Debug_Recv = 1Global $iSock = TCPConnect("172.18.65.159", 502)
[/autoit] [autoit][/autoit] [autoit]If $iSock = -1 Then
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("Fehler Verbindungsaufbau" & @LF)
Exit
EndIf$repeat = 5
[/autoit] [autoit][/autoit] [autoit]While $repeat >= 1
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite("write" & @CRLF)
[/autoit] [autoit][/autoit] [autoit]
$retval = _native_ModbusTCP_WriteCoils($iSock, 1, 1) ;
ConsoleWrite("$retval =" & $retval & @CRLF)Sleep(100)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("clear" & @CRLF)
$retval = _native_ModbusTCP_WriteCoils($iSock, 1, 0)
ConsoleWrite("$retval =" & $retval & @CRLF); oder
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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
[/autoit] [autoit][/autoit] [autoit]
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)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("Bits = " & $iRet & @CRLF)$repeat = $repeat - 1
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit]TCPCloseSocket($iSock)
[/autoit] [autoit][/autoit] [autoit]
TCPShutdown()EndFunc ;==>_example_nativ
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];--------------------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]Func _example_libDll()
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "_example_libDll()", "Example with the libmodbus.dll")_Modbus_DllOpen()
[/autoit] [autoit][/autoit] [autoit]Global $tModbus = _Modbus_New_TCP("172.18.65.159")
[/autoit] [autoit][/autoit] [autoit]
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)
[/autoit] [autoit][/autoit] [autoit];Global $aVal = _Modbus_Read_Registers($tModbus, 0, 1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;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
[/autoit] [autoit][/autoit] [autoit]While $repeat >= 1
[/autoit] [autoit][/autoit] [autoit]$aVal = _Modbus_Write_Register($tModbus, 0, 1)
[/autoit] [autoit][/autoit] [autoit]
;_ArrayDisplay($aVal)
;MsgBox(0,"",$aVal)Sleep(100)
[/autoit] [autoit][/autoit] [autoit]
$aVal = _Modbus_Write_Register($tModbus, 0, 0)
;_ArrayDisplay($aVal)
;MsgBox(0,"",$aVal)$aVal = _Modbus_Read_Registers($tModbus, 0, 1)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aVal)
;MsgBox(0,"",$aVal)$repeat = $repeat - 1
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]_Modbus_Close($tModbus)
[/autoit] [autoit][/autoit] [autoit]
_Modbus_Free($tModbus)EndFunc ;==>_example_libDll
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func Terminate()
[/autoit]
Exit 0
EndFunc ;==>Terminatedie einfache Visualisierung welche für die kleinste Konfiguration einer Wago 750-341 mit Di Modul 750-430 und Do Modul 750-530 läuft.
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include<modbus.au3>
#include<DEC_HEX_BIN.au3>#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=c:\users\marc.neininger\desktop\form1.kxf
$Form1_1 = GUICreate("Wago Visualisierung", 461, 447, 263, 224)
;$Label1 = GUICtrlCreateLabel("Wago Visualisierung", 0, 0, 128, 20)
$Group1 = GUICtrlCreateGroup("DI", 168, 24, 137, 409)
$DIB_00 = GUICtrlCreateCheckbox("DIB_00", 176, 48, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_01 = GUICtrlCreateCheckbox("DIB_01", 176, 72, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_02 = GUICtrlCreateCheckbox("DIB_02", 176, 96, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_03 = GUICtrlCreateCheckbox("DIB_03", 176, 120, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_04 = GUICtrlCreateCheckbox("DIB_04", 176, 144, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_05 = GUICtrlCreateCheckbox("DIB_05", 176, 168, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_06 = GUICtrlCreateCheckbox("DIB_06", 176, 192, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_07 = GUICtrlCreateCheckbox("DIB_07", 176, 216, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_08 = GUICtrlCreateCheckbox("DIB_08", 176, 240, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_09 = GUICtrlCreateCheckbox("DIB_09", 176, 264, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_10 = GUICtrlCreateCheckbox("DIB_10", 176, 288, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_11 = GUICtrlCreateCheckbox("DIB_11", 176, 312, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_12 = GUICtrlCreateCheckbox("DIB_12", 176, 336, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_13 = GUICtrlCreateCheckbox("DIB_13", 176, 360, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_14 = GUICtrlCreateCheckbox("DIB_14", 176, 384, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
$DIB_15 = GUICtrlCreateCheckbox("DIB_15", 176, 408, 97, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("Settings", 8, 24, 153, 409)
$Label2 = GUICtrlCreateLabel("IP-Wago", 24, 48, 57, 20)
$Imp_IP = GUICtrlCreateInput("172.18.65.159", 24, 72, 121, 24)
$connect = GUICtrlCreateButton("connect", 24, 360, 123, 25)
$dissconnect = GUICtrlCreateButton("dissconnect", 24, 400, 123, 25)
$Label3 = GUICtrlCreateLabel("DI-Adress", 24, 176, 64, 20)
$DI_Adress = GUICtrlCreateInput("00", 24, 200, 121, 24)
$Label4 = GUICtrlCreateLabel("DO-Adress", 24, 240, 71, 20)
$DO_Adress = GUICtrlCreateInput("00", 24, 264, 121, 24)
$Label5 = GUICtrlCreateLabel("Pool-Time", 24, 112, 67, 20)
$Pool_time = GUICtrlCreateInput("50", 24, 136, 121, 24)
$Group2 = GUICtrlCreateGroup("DO", 311, 25, 137, 409)
$DOB_00 = GUICtrlCreateCheckbox("DOB_00", 319, 49, 97, 17)
$DOB_01 = GUICtrlCreateCheckbox("DOB_01", 319, 73, 97, 17)
$DOB_02 = GUICtrlCreateCheckbox("DOB_02", 319, 97, 97, 17)
$DOB_03 = GUICtrlCreateCheckbox("DOB_03", 319, 121, 97, 17)
$DOB_04 = GUICtrlCreateCheckbox("DOB_04", 319, 145, 97, 17)
$DOB_05 = GUICtrlCreateCheckbox("DOB_05", 319, 169, 97, 17)
$DOB_06 = GUICtrlCreateCheckbox("DOB_06", 319, 193, 97, 17)
$DOB_07 = GUICtrlCreateCheckbox("DOB_07", 319, 217, 97, 17)
$DOB_08 = GUICtrlCreateCheckbox("DOB_08", 319, 241, 97, 17)
$DOB_09 = GUICtrlCreateCheckbox("DOB_09", 319, 265, 97, 17)
$DOB_10 = GUICtrlCreateCheckbox("DOB_10", 319, 289, 97, 17)
$DOB_11 = GUICtrlCreateCheckbox("DOB_11", 319, 313, 97, 17)
$DOB_12 = GUICtrlCreateCheckbox("DOB_12", 319, 337, 97, 17)
$DOB_13 = GUICtrlCreateCheckbox("DOB_13", 319, 361, 97, 17)
$DOB_14 = GUICtrlCreateCheckbox("DOB_14", 319, 385, 97, 17)
$DOB_15 = GUICtrlCreateCheckbox("DOB_15", 319, 409, 97, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
_DO($GUI_DISABLE)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###;----------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_Modbus_DllOpen();$Gui_Name_String = "$DIB_00|$DIB_01|$DIB_02|$DIB_03|$DIB_04|$DIB_05|$DIB_06|$DIB_07|$DIB_08|$DIB_09|$DIB_10|$DIB_11|$DIB_12|$DIB_13|$DIB_14|$DIB_15|$DIB_16|$DIB_17"
[/autoit] [autoit][/autoit] [autoit]
;Global $GUI_DI_Handler = StringSplit($Gui_Name_String, "|")Dim $GUI_DI_Handler[18]
[/autoit] [autoit][/autoit] [autoit]
$GUI_DI_Handler[0] = $DIB_00
$GUI_DI_Handler[1] = $DIB_01
$GUI_DI_Handler[2] = $DIB_02
$GUI_DI_Handler[3] = $DIB_03
$GUI_DI_Handler[4] = $DIB_04
$GUI_DI_Handler[5] = $DIB_05
$GUI_DI_Handler[6] = $DIB_06
$GUI_DI_Handler[7] = $DIB_07
$GUI_DI_Handler[8] = $DIB_08
$GUI_DI_Handler[9] = $DIB_09
$GUI_DI_Handler[10] = $DIB_10
$GUI_DI_Handler[11] = $DIB_11
$GUI_DI_Handler[12] = $DIB_12
$GUI_DI_Handler[13] = $DIB_13
$GUI_DI_Handler[14] = $DIB_14
$GUI_DI_Handler[15] = $DIB_15
$GUI_DI_Handler[16] = ""Global $Wago_Connected = False
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]$nMsg = GUIGetMsg()
[/autoit] [autoit][/autoit] [autoit]
Switch $nMsg
Case $GUI_EVENT_CLOSE
ExitCase $connect
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetState($connect, $GUI_DISABLE) ; the label is in disable state
GUICtrlSetState($Imp_IP, $GUI_DISABLE) ; the label is in disable state
$IP = GUICtrlRead($Imp_IP)Global $tModbus = _Modbus_New_TCP($IP)
[/autoit] [autoit][/autoit] [autoit]
If _Modbus_Connect($tModbus) = -1 Then
ConsoleWrite("! Fehler: Es konnte keine Verbindung aufgebaut werden." & @CRLF)
_Modbus_Free($tModbus)
GUICtrlSetState($connect, $GUI_ENABLE) ; the label is in disable state
;Exit
EndIf
Global $aVal$aVal = _Modbus_Set_Debug($tModbus, 1)
[/autoit] [autoit][/autoit] [autoit]
$aVal = _Modbus_Write_Register($tModbus, 0, 0 )_DO($GUI_ENABLE)
[/autoit] [autoit][/autoit] [autoit]$Wago_Connected = True
[/autoit] [autoit][/autoit] [autoit]Case $dissconnect
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$Wago_Connected = False
_DO($GUI_DISABLE)
GUICtrlSetState($connect, $GUI_ENABLE) ; the label is in disable state
GUICtrlSetState($Imp_IP, $GUI_ENABLE) ; the label is in disable state
_Modbus_Close($tModbus)
_Modbus_Free($tModbus)
Case $DOB_00
_DO_chance($DOB_00, 0)
Case $DOB_01
_DO_chance($DOB_01, 1)
Case $DOB_02
_DO_chance($DOB_02, 2)
Case $DOB_03
_DO_chance($DOB_03, 3)
Case $DOB_04
_DO_chance($DOB_04, 4)
Case $DOB_05
_DO_chance($DOB_05, 5)
Case $DOB_06
_DO_chance($DOB_06, 6)
Case $DOB_07
_DO_chance($DOB_07, 7)
Case $DOB_08
_DO_chance($DOB_08,
Case $DOB_09
_DO_chance($DOB_09, 9)
Case $DOB_10
_DO_chance($DOB_10, 10)
Case $DOB_11
_DO_chance($DOB_11, 11)
Case $DOB_12
_DO_chance($DOB_12, 12)
Case $DOB_13
_DO_chance($DOB_13, 13)
Case $DOB_14
_DO_chance($DOB_14, 14)
Case $DOB_15
_DO_chance($DOB_15, 15)
EndSwitchIf $Wago_Connected Then
[/autoit] [autoit][/autoit] [autoit]
$aVal = _Modbus_Read_Input_Registers($tModbus, GUICtrlRead($DI_Adress), 1)
; das Register als Binary
$inBinary = _DecToBinary($aVal[0])
_DI_Change($inBinary)EndIf
[/autoit] [autoit][/autoit] [autoit]Sleep( GUICtrlRead($Pool_time))
[/autoit] [autoit][/autoit] [autoit]
WEndFunc _DI_Change($Binary)
[/autoit] [autoit][/autoit] [autoit]Dim $DIArray[17]
[/autoit] [autoit][/autoit] [autoit]
;die bits dem array übergeben
For $i = 0 To BinaryLen($Binary) Step 1
$DIArray[$i] = StringMid($Binary, StringLen($Binary) - $i, 1)
Next; mit 0en füllen
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To (UBound($DIArray) - 1) Step 1
If Not (($DIArray[$i] = "1") Or ($DIArray[$i] = "0")) Then
$DIArray[$i] = 0
EndIfNext
[/autoit] [autoit][/autoit] [autoit]; den Gui State in das array übertragen
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To (UBound($DIArray) - 1) Step 1
If ($DIArray[$i] = "1") Then
$DIArray[$i] = $GUI_CHECKED
Else
$DIArray[$i] = $GUI_UNCHECKED
EndIfNext
[/autoit] [autoit][/autoit] [autoit];_ArrayDisplay($DIArray)
[/autoit] [autoit][/autoit] [autoit]
;_ArrayDisplay($GUI_DI_Handler); die GUI aktualisieren
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $i = 0 To (UBound($DIArray) - 1) Step 1
GUICtrlSetState($GUI_DI_Handler[$i], $DIArray[$i])
NextEndFunc
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _DO_chance($Conrole_ID, $Bit)
[/autoit] [autoit][/autoit] [autoit]
$Bit = $Bit + GUICtrlRead($DO_Adress)
$state = GUICtrlRead($Conrole_ID)
If $state = 1 Then
_Modbus_Write_Bit($tModbus, $Bit, 1)
Else
_Modbus_Write_Bit($tModbus, $Bit, 0)
EndIfEndFunc ;==>_DO_chance
[/autoit] [autoit][/autoit] [autoit]Func _DO($Status)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetState($DOB_00, $Status)
GUICtrlSetState($DOB_01, $Status)
GUICtrlSetState($DOB_02, $Status)
GUICtrlSetState($DOB_03, $Status)
GUICtrlSetState($DOB_04, $Status)
GUICtrlSetState($DOB_05, $Status)
GUICtrlSetState($DOB_06, $Status)
GUICtrlSetState($DOB_07, $Status)
GUICtrlSetState($DOB_08, $Status)
GUICtrlSetState($DOB_09, $Status)
GUICtrlSetState($DOB_10, $Status)
GUICtrlSetState($DOB_11, $Status)
GUICtrlSetState($DOB_12, $Status)
GUICtrlSetState($DOB_13, $Status)
GUICtrlSetState($DOB_14, $Status)
GUICtrlSetState($DOB_15, $Status)EndFunc ;==>_DO
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _example_libDll()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];Global $aVal = _Modbus_Read_Registers($tModbus, 0, 1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;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 )EndFunc ;==>_example_libDll
[/autoit]die Modbus.udf läuft entweder über die im Netz verfügbare libmodbus.dll von libmodbus.org
Oder "Native" nur über den TCP-Stack von Autoit ( allerdings nur ein paar wichtige Grundfunktionen )
Da die libmodbus noch viel Funktionen beinhaltet, die ich so noch nie verwendet habe, sind nicht alle umgesetzt.
Diese Funktionen finden sich im "doc_offen" Ordner im Zip File.Fragen / Änderungen / Wünsche sind gerne gesehen.
Viel Spaß damit !!
-
ich korrigiere !!
du Teufelskerl !!!

du hast es ja geschafft !!!

das ist ja die original libmodbus.dll !!!!!!!!
UNGLAUBLICH !!!
S ganze Wochenende hab ich rum getüftelt !! und du machst des halt mal geschwind so nebenher !! :wacko:
jetzt bin ich echt baff !!!!
dann kann ich mir die UDF ja sparen .. bzw diese auf die DLL schreiben .. !!
DANKE !!!!!
-
well done !!
hast mir da auch die source ?
hab vorhin bemerkt, dass ich ne Verzögerung von 20ms pro Befehl habe .. ( via Oszi an der Wago )

ich denke Autoit wird vielleicht irgend wo die Bremse angezogen haben.
Da wäre eine C DLL echt was hübsches .. ..
gibt n paar fertige im netz .. nmodbus/ und http://freemodbus.berlios.de/ und natürlich noch http://libmodbus.org/
wenn wir die in AutoIt ansprechen könnten, wäre das wirklich ne runde Sache .. aber deine Möglichkeit geht natürlich auch .. müsste ich dann halt wieder erweitern ( wenn du mir die gibst )
An dem einbauen der "fertigen dll's" bin ich ja schon gescheitert.

ps hier noch die Funktion "WriteSingleRegister" ;für den den's interessiert
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
Func _ModbusTCP_WriteSingleRegister($mainsocket,ByRef $TI, $iStartAddress, $iNumOfCoils)
;Local Static $TI = 0
$TI += 1Local $iBytesToSend = 6, $iFunctionCode = "06"
[/autoit] [autoit][/autoit] [autoit]If $iNumOfCoils < 0 Then
[/autoit] [autoit][/autoit] [autoit]
Return SetError(1, 0, 0)
EndIf_ModbusTCP_Send($mainsocket, "0x" & Hex($TI, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($iStartAddress, 4) & Hex($iNumOfCoils, 4))
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(2, 0, 0)Local $sRecv
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit]
$sRecv = _ModbusTCP_Recv($mainsocket, 512)
Until @error Or $sRecv <> ""
If @error Then Return SetError(3, 0, 0)If Int(String(BinaryMid($sRecv, 1, 2))) <> $TI Then Return SetError(4, 0, 0)
[/autoit] [autoit][/autoit] [autoit];Local $iAnzahlBytes = Int(String(BinaryMid($sRecv, 9, 1)))
[/autoit] [autoit][/autoit] [autoit];ConsoleWrite("Anzahl der erhaltenen Daten: " & $iAnzahlBytes & " Byte(s), max " & $iAnzahlBytes * 8 & " Bits." & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Return 1;_Convert_To_Binary(Int(String(BinaryMid($sRecv, 10, $iAnzahlBytes))))
[/autoit]
EndFunc ;==>_ModbusTCP_ReadCoilswenn ich mit allen Funktionen fertig bin, mach ich natürkich ne UDF draus .. mit Docu
-
Hei funkey
falls du's mal brauchst .. -> _ModbusTCP_WriteCoils ( 0x05 )
Spoiler anzeigen
[autoit][/autoit] [autoit][/autoit] [autoit]ConsoleWrite("write" & @CRLF)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$retval = _ModbusTCP_WriteCoils($iSock,$TI, 1, 1) ;
ConsoleWrite("$retval ="& $retval & @CRLF)ConsoleWrite("clear" & @CRLF)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$retval = _ModbusTCP_WriteCoils($iSock,$TI, 1, 0)
ConsoleWrite("$retval ="& $retval & @CRLF)Func _ModbusTCP_WriteCoils($mainsocket,ByRef $TI, $Port_adress , $Hi_Lo)
[/autoit] [autoit][/autoit] [autoit]
;Local Static $TI = 0
$TI += 1Local $iBytesToSend = 6, $iFunctionCode = "05"
[/autoit] [autoit][/autoit] [autoit]If $Port_adress < 1 Then Return SetError(1, 0, 0)
[/autoit] [autoit][/autoit] [autoit]If $Hi_Lo = 1 then
[/autoit] [autoit][/autoit] [autoit]
_ModbusTCP_Send($mainsocket, "0x" & Hex($TI, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($Port_adress-1, 4) & "FF00"); 65280 = FF00ElseIf $Hi_Lo = 0 then
[/autoit] [autoit][/autoit] [autoit]
_ModbusTCP_Send($mainsocket, "0x" & Hex($TI, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($Port_adress-1, 4) & "0000")Else
[/autoit] [autoit][/autoit] [autoit]
;If $iNumOfCoils < 1 Then Return SetError(1, 0, 0)
Return SetError(1, 0, 0)
;_ModbusTCP_Send($mainsocket, "0x" & Hex($TI, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($iStartAddress, 4) & Hex($iNumOfCoils, 4))EndIf
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(2, 0, 0)Local $sRecv
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit]
$sRecv = _ModbusTCP_Recv($mainsocket, 512)
Until @error Or $sRecv <> ""
If @error Then Return SetError(3, 0, 0)If Int(String(BinaryMid($sRecv, 1, 2))) <> $TI Then Return SetError(4, 0, 0)
[/autoit] [autoit][/autoit] [autoit];Local $iAnzahlBytes = Int(String(BinaryMid($sRecv, 9, 1)))
[/autoit] [autoit][/autoit] [autoit];ConsoleWrite("Anzahl der erhaltenen Daten: " & $iAnzahlBytes & " Byte(s), max " & $iAnzahlBytes * 8 & " Bits." & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Return 1 ;_Convert_To_Binary(Int(String(BinaryMid($sRecv, 10, $iAnzahlBytes))))
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_ModbusTCP_ReadCoils
[/autoit] [autoit][/autoit] [autoit][/autoit] -
NACHTRAG :
mit der Ergänzung
[autoit]
[/autoit]
$aTest = _ModbusTCP_ReadValues($iSock, 4, 0, 1, "word") ;Functioncode 4, Register 1, Länge 4 Resiter lesen, als float zurückgeben
_ArrayDisplay($aTest)bekomme ich das imput Register


hast du noch ne Funktion zum Schreiben ?
Write Singel Coil ? ( 0x05 )
und
Write Singel Register ? ( 0x06) -
Hei funkey !! DANKESCHÖN !!
Sieht heiss aus der Code ... Hast noch n bissel mehr davon ? ( du hast übrigens recht bei mir läuft der nicht .. :wacko: )
Werde mich jetzt da wohl reindenken müssen ...

Dachte ich komm unter Zuhilfenahme der DLL um das ganze ModBus/TCP Protokoll drum rum ..

Man muss ja das Rad nicht 2 mal erfinden ..

-
Hallo sehr geehrte Community !
Ich bin gerade an einem kleinen Projekt, um mit AutoIt via Modbus/TCP eine WAGO 750-341 anzusprechen.
( eine WAGO 750-341 ist ein Ethernet Koppler mit dem man Digitale und Analoge Ein und Ausgänge ansprechen kann) ( geiles Teil )Jetzt habe ich da im Internet eine DLL gefunden namens "libmodbus.dll" ist ein OpenSource Projekt ( http://libmodbus.org/ )
Dokumentation ist eigentlich alles da aber ich bin wohl nicht in der Lage das ding zum laufen zu kriegen.
hier die Funktion an der ich scheitere :
in C -> modbus_t *modbus_new_tcp(const char *ip, int port);
bedeutet für mich :
[autoit]
[/autoit][autoit][/autoit][autoit]
Local $dll = DllOpen("libmodbus.dll")
Local $ctx = DllStructCreate("STRUCT")
Local $ip = DllStructCreate("CHAR[128]")
DllStructSetData($ip, 1, "172.18.65.159")$ctx = DllCall($dll, "ptr", "modbus_new_tcp", "ptr", DllStructGetPtr($ip), "int", 502)
[/autoit][autoit][/autoit][autoit]MsgBox(0,"$ctx",$ctx)
[/autoit][autoit][/autoit][autoit]EXIT
[/autoit][autoit][/autoit][autoit][/autoit]das einzige was da bei raus kommt ist
!>15:56:38 AutoIT3.exe ended.rc:-1073741819
eine Strukturdefinierung von "modbus_t" ist in der Doku mit " typedef struct _modbus modbus_t;" beschrieben.
FINDE den FEHLER !! ??!?

DANKE !!
-
kann sowas funktionieren ?!?
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
;$oDataToPostBstr = __IEStringToBstr($sDataToPost) ; convert string to BSTRFunc __IEStringToBstr($s_string, $s_charSet = "us-ascii")
[/autoit] [autoit][/autoit] [autoit]
Local Const $adTypeBinary = 1, $adTypeText = 2
Local $o_Stream$o_Stream = ObjCreate("ADODB.Stream")
[/autoit] [autoit][/autoit] [autoit]$o_Stream.Type = $adTypeText
[/autoit] [autoit][/autoit] [autoit]
$o_Stream.CharSet = $s_charSet
$o_Stream.Open
$o_Stream.WriteText($s_string)
$o_Stream.Position = 0$o_Stream.Type = $adTypeBinary
[/autoit] [autoit][/autoit] [autoit]
$o_Stream.Position = 0Return $o_Stream.Read
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>__IEStringToBstrFunc __IEBstrToString($o_bstr, $s_charSet = "us-ascii")
[/autoit] [autoit][/autoit] [autoit]
Local Const $adTypeBinary = 1, $adTypeText = 2
Local $o_Stream$o_Stream = ObjCreate("ADODB.Stream")
[/autoit] [autoit][/autoit] [autoit]$o_Stream.Type = $adTypeBinary
[/autoit] [autoit][/autoit] [autoit]
$o_Stream.Open
$o_Stream.Write($o_bstr)
$o_Stream.Position = 0$o_Stream.Type = $adTypeText
[/autoit] [autoit][/autoit] [autoit]
$o_Stream.CharSet = $s_charSet
$o_Stream.Position = 0Return $o_Stream.ReadText
[/autoit] [autoit][/autoit] [autoit][/autoit]
EndFunc ;==>__IEBstrToString?!? kann da jemand was mit anfangen ?!? und eventuell umschreiben ?
-
guck dir mal die UDF Funktion "_FileListToArray" an ...
die kannst du entsprechend parametrieren, dass entwerde File's oder Folder zurückgegeben werden ..
oder beides .. ich finde einzeln aber irgend wie geschickter.... dann must nicht später noch mal sortieren ..dann hast du 2 array's .. Pro Ordner/ebene
das File array lässt du mit "FileGetTime" die Zeit vergleichen ..
.. für die Unterordner musst du dir halt ne Funktion bauen, die du dann Recursiv abarbeitest ...
die Ergebnisse/ Unterschiede würde ich in ein Log ablegen ..
und anschliessend von einer getrennten Funktion verschieben lassen ..
Dann kannst du erst mal gut debuggen ohne immer wieder eine Testsituation generieren zu müssen .. -
-
bitte thread als CLOSE Markieren .. DANKE !!
-
fileTime °°
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
Local $t = FileGetTime(@WindowsDir & "\notepad.exe", 1)If Not @error Then
[/autoit]
Local $yyyymd = $t[0] & "/" & $t[1] & "/" & $t[2]
MsgBox(0, "Creation date of notepad.exe", $yyyymd)
EndIf -
ich kann zwar nix zu deinem RegEX mithelfen .. hab da aber ne UHRALTE SUCHFUNKTION bei mir im archiv gefunden ..
versuch die doch mal ..
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#cs ----------------------------------------------------------------------------AutoIt Version:
[/autoit] [autoit][/autoit] [autoit]
Author: VivusScript Function:
[/autoit] [autoit][/autoit] [autoit]
Sucht eine Datei, bezieht dabei alle Unterordner mit ein.
Es wird der native-pfad der ersten Datei zurückgeliefert.#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]Global $_searchSilent = 0
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _searchFileInSUBDirectorys($startpath, $Filename)
[/autoit] [autoit][/autoit] [autoit]
If $_searchSilent = 1 then ConsoleWrite("_searchFileInSUBDirectorys von " & $startpath & " nach " & $Filename & @CRLF)
$filePath = _searchFileInDirectory($startpath, $Filename)
;ConsoleWrite("-S->"&$filePath& @CRLF)
If $filePath = False Then
; einen ordner tiefer
$A_return = _getArrayOfDirectorys($startpath)
;_ArrayDisplay($A_return, "$A_return in _searchFileInSUBDirectorys ")
If $A_return[0] > 0 Then
; subfolder vorhanden
;MsgBox(0, "alter_pfad _searchFileInSUBDirectorys", $startpath)
For $i = 1 To $A_return[0]
;ConsoleWrite("_getArrayOfDirectorys max = "&$A_return[0] & " momentan " & $A_return[$i] & @CRLF)
$path_and_sub_folder = $startpath& "\" &$A_return[$i]; jetzt die recursion !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[/autoit] [autoit][/autoit] [autoit]
$recursion_value = _searchFileInSUBDirectorys($path_and_sub_folder, $Filename)If $recursion_value = False Then
[/autoit] [autoit][/autoit] [autoit]
;such weiter
Else
Return $recursion_value
EndIf
Next
Else
; kein sub folder
;MsgBox(0, "kein sub folder -> _searchFileInSUBDirectorys", "kein sub folder in " & $search_Place)
EndIf
EndIfIf $_searchSilent = 1 then ConsoleWrite("Result = " & $filePath & @CRLF)
[/autoit] [autoit][/autoit] [autoit]
Return $filePath
EndFunc ;==>_searchFileInSUBDirectorysFunc _getArrayOfDirectorys($path)
[/autoit] [autoit][/autoit] [autoit]
Dim $A_return[1]
;_ArrayDisplay($A_return, "$A_return")
Local $Folder_array = _FileListToArray($path, "*", 2)
If @error > 0 Then
;MsgBox(0, "", "No Folders Found.")
$A_return[0] = 0
Return $A_return
EndIf
Return $Folder_array
EndFunc ;==>_getArrayOfDirectorysFunc _searchFileInDirectory($path, $Filename)
[/autoit] [autoit][/autoit] [autoit]
$retval = FileExists($path & "\" & $Filename)
;ConsoleWrite("_searchFileInDirectory "&$path & " nach " & $Filename & "Retval = " &$retval &@CRLF)
If $retval = 1 Then
Return $path & "\" & $Filename
Else
Return False
EndIf
EndFunc ;==>_searchFileInDirectory; #FUNCTION# ====================================================================================================================
[/autoit]
; Name...........: _FileListToArray
; Description ...: Lists files and\or folders in a specified path (Similar to using Dir with the /B Switch)
; Syntax.........: _FileListToArray($sPath[, $sFilter = "*"[, $iFlag = 0]])
; Parameters ....: $sPath - Path to generate filelist for.
; $sFilter - Optional the filter to use, default is *. Search the Autoit3 helpfile for the word "WildCards" For details.
; $iFlag - Optional: specifies whether to return files folders or both
; |$iFlag=0(Default) Return both files and folders
; |$iFlag=1 Return files only
; |$iFlag=2 Return Folders only
; Return values .: @Error - 1 = Path not found or invalid
; |2 = Invalid $sFilter
; |3 = Invalid $iFlag
; |4 = No File(s) Found
; Author ........: SolidSnake <MetalGX91 at GMail dot com>
; Modified.......:
; Remarks .......: The array returned is one-dimensional and is made up as follows:
; $array[0] = Number of Files\Folders returned
; $array[1] = 1st File\Folder
; $array[2] = 2nd File\Folder
; $array[3] = 3rd File\Folder
; $array[n] = nth File\Folder
; Related .......:
; Link ..........:
; Example .......: Yes
; Note ..........: Special Thanks to Helge and Layer for help with the $iFlag update speed optimization by code65536, pdaughe
; ===============================================================================================================================
Func _FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
Local $hSearch, $sFile, $sFileList, $sDelim = "|"
$sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\" ; ensure single trailing backslash
If Not FileExists($sPath) Then Return SetError(1, 1, "")
If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
$hSearch = FileFindFirstFile($sPath & $sFilter)
If @error Then Return SetError(4, 4, "")
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If ($iFlag + @extended = 2) Then ContinueLoop
$sFileList &= $sDelim & $sFile
WEnd
FileClose($hSearch)
If Not $sFileList Then Return SetError(4, 4, "")
Return StringSplit(StringTrimLeft($sFileList, 1), "|")
EndFunc ;==>_FileListToArray -
du nimmst die bestehenden Array's
generierst ein neues in der entsprechenden Größe ( mehrdimensional ) und füllst es in einer For schleife mit deinen Werten auf ..z.B.
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
; ein Array für die inhalte der Sections
Dim $A_contents[UBound($A_sections, 1)][2];Das A_content fülle
[/autoit]
For $i = 1 To $A_sections[0]
$A_contents[$i][0] = $A_sections[$i]
$A_contents[$i][1] = $B_irgendwass[$i]
Next -
ja das sehe ich ja .. hab ich ja im jetzten Beitrag von mir auch geschrieben ..
ABER was kann ich alternativ nehmen ....
hab es jetzt mit char und wchar versucht .. in 128 und 256 größe ..
immer noch Fehler .. ..
-
aaach MOMENT !!
du meinst dass ich kein Typ " str" oder "bstr" verwenden kann ..
mmm .. aber was nehm ich denn da alternativ ?!?
war total in der "ObjCreateInterface" Funktion und DA GIBT es "str" und "bstr" dachte das ist allgemein .....

-
... hhäää ?
WO ?!?
also in der Hilfe steht :
[autoit]
[/autoit][autoit][/autoit][autoit]
;create the struct
Local $rect = DllStructCreate("int;int;int;int");hab ich umgesetzt mit
[/autoit][autoit][/autoit][autoit]
Local $aStruct = DllStructCreate("str");den @error
[/autoit][autoit][/autoit][autoit]
If @error Then
MsgBox(0, "", "Error in DllStructCreate " & @error);
Exit
EndIf; OK wird noch dran gehängt
[/autoit][autoit][/autoit][autoit]; jetzt den Pointer übergeben
[/autoit][autoit][/autoit][autoit]
; in der hilfe mit DllStructGetPtr($rect , 1)) für den Pointer der Eintragung in der Struct
; sollte ja aber bei nur einer Eintragung im Struct auch mit DllStructGetPtr($rect ) funktionieren. dann ist es halt der pointer auf den ganzen Struct;hab ich umgesetzt mit
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$bError = $ls.GetVersion(DllStructGetPtr($aStruct))
;und auch mit
$bError = $ls.GetVersion(DllStructGetPtr($aStruct,1)); da steh ich jetzt wohl total auf dem Schlauch !!
[/autoit]
; kannst mir da kein "genaueren" Tip geben? ??! BITTE !! -
habe folgendes Versucht.
[autoit]
[/autoit][autoit][/autoit][autoit]
Local $aStruct = DllStructCreate("bstr* string")
$bError = $ls.GetVersion(DllStructGetPtr($aStruct)$szLabel = DllStructGetData($aStruct, 1)
[/autoit]
MsgBox(0, @ScriptName, $szLabel & " = $ls.GetVersion($szLabel)")wieder ein Fehler ....
[autoit]
dann
[/autoit][autoit][/autoit][autoit]
Local $aStruct = DllStructCreate("bstr string")
$bError = $ls.GetVersion(DllStructGetPtr($aStruct)$szLabel = DllStructGetData($aStruct, 1)
[/autoit]
MsgBox(0, @ScriptName, $szLabel & " = $ls.GetVersion($szLabel)")selber Fehler
[autoit]
Dann
[/autoit][autoit][/autoit][autoit]
Local $aStruct = DllStructCreate("str")
$bError = $ls.GetVersion(DllStructGetPtr($aStruct,1)$szLabel = DllStructGetData($aStruct, 1)
[/autoit]
MsgBox(0, @ScriptName, $szLabel & " = $ls.GetVersion($szLabel)")immer noch Fehler
[autoit]
dann
[/autoit][autoit][/autoit][autoit]
Local $aStruct = DllStructCreate("str")
$bError = $ls.GetVersion(DllStructGetPtr($aStruct)$szLabel = DllStructGetData($aStruct,1)
[/autoit]
MsgBox(0, @ScriptName, $szLabel & " = $ls.GetVersion($szLabel)")und jetzt fällt mir nix mehr ein ...
Bitte sag mir das ich n Fehler gemacht hab .. -
Hi water !
Das mit dem ErrorHandler hatte ich total überlesen ! ist ja Praktisch
aber der Fehler ist immer noch da :
[autoit]
Meldung
[/autoit][autoit][/autoit][autoit]
--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
err.number is: -2147352571
err.windescription: Typkonflikt.err.description is:
[/autoit][autoit][/autoit][autoit]
err.source is:
err.helpfile is:
err.helpcontext is: 0
err.lastdllerror is: 0
err.scriptline is: 49
err.retcode is: 0+>17:19:15 AutoIT3.exe ended.rc:0
[/autoit]
>Exit code: 0 Time: 16.947wie vermutet ein Typkonflikt.....
ich glaube er mag meine "string" Variable nicht als Pointer akzeptieren.
kann man das nicht irgend wie Casten ?z.b.
[autoit]$bError = $ls.GetVersion(Ptr($String))
[/autoit]