Anstelle von WinActive könntest du auch WinExists verwenden, oder du nimmst gleich WinGetText
[autoit]StringInStr(WinGetText("Skype"), "Skype Test Call")
[/autoit]Anstelle von WinActive könntest du auch WinExists verwenden, oder du nimmst gleich WinGetText
[autoit]StringInStr(WinGetText("Skype"), "Skype Test Call")
[/autoit]Funktioniert doch schon.
Was du noch machen kannst, ist das @CR aus dem @CRLF zu entfernen, damit nur noch ein Symbol (@LF) übrigbleibt.
Angezeigt werden kann da ja nur ein Kästchen.
Beim nächsten Mal poste ein lauffähiges Beispiel zum Testen, und nicht nur eine Zeile!
#include <Array.au3>
#include <EditConstants.au3>
GUICreate("", 500, 350)
$rohTextFeld = GUICtrlCreateEdit("", 10, 10, 480, 300, $ES_WANTRETURN)
$nBtn = GUICtrlCreateButton("Lese in Array", 10, 320, 480, 20)
GUISetState()
[/autoit][autoit][/autoit][autoit]Global $iMsg
[/autoit][autoit][/autoit][autoit]Do
$iMsg = GUIGetMsg()
If $iMsg = $nBtn Then
$rohText = StringSplit(StringReplace(GUICtrlRead($rohTextFeld), @CRLF, @LF), '', 2)
_ArrayDisplay($rohText)
EndIf
Until $iMsg = -3
Ohne Beschreibung der Funktionen der DLL wirst du keine Chance haben, sie benutzen zu können.
Du kannst eigentlich nur nach den Funktionsnamen googlen und hoffen, dass du was findest.
hmm, die Verwendung von Windows-Standard-Funktionen funktioniert nicht bei Win8? Btw. was funktioniert nicht bzw. was ist der Fehler?
Bestätigt mein bisheriges Vorgehen, immer nur jede 2. BS-Version zu verwenden.
[Blockierte Grafik: http://www.globalnerdy.com/wordpress/wp-content/uploads/2011/09/windows-good-and-shit.jpg]
Sowas geht doch auch sicher ohne temporäre Datei. ![]()
Oder zumindest könnte man die Datei nach dem Ausführen wieder löschen.
Ich glaube er meint so:
[autoit]#include <Array.au3>
[/autoit][autoit][/autoit][autoit]Global $value1a[3] = ['1a','2a','3a']
Global $value1b[3] = ['1b','2b','3b']
Global $value1c[3] = ['1c','2c','3c']
Global $aValue[3] = [$value1a, $value1b, $value1c]
[/autoit][autoit][/autoit][autoit]_ArrayDisplay($aValue[0])
_ArrayDisplay($aValue[1])
_ArrayDisplay($aValue[2])
Aber natürlich ist ein 2-dimensionales Array besser. (Noch, bis zur nächsten AutoIt-Version)
Ich wünsche auch allen hier ein gutes, neues Jahr! Bleibt gesund!
Alles Gute zum Geburtstag, letsgo! ![]()
![]()
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <WinAPI.au3>
GUICreate("My GUI Button") ; will create a dialog box that when displayed is centered
[/autoit] [autoit][/autoit] [autoit]Opt("GUICoordMode", 2)
Global $Button_1 = GUICtrlCreateButton("Run Notepad", 10, 30, 100)
Global $Button_2 = GUICtrlCreateButton("Button Test", 0, -1)
Global $Button_3 = GUICtrlCreateButton("Without Tabstop", 0, -1)
Global $hButton_3 = GUICtrlGetHandle(-1)
Global $iStyle = _WinAPI_GetWindowLong($hButton_3, $GWL_STYLE)
_WinAPI_SetWindowLong($hButton_3, $GWL_STYLE, BitXOR($iStyle, $WS_TABSTOP))
GUISetState()
[/autoit] [autoit][/autoit] [autoit]Global $msg
[/autoit] [autoit][/autoit] [autoit]While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $Button_1
Run('notepad.exe')
Case $msg = $Button_2
MsgBox(0, 'Testing', 'Button 2 was pressed')
Case $msg = $Button_3
MsgBox(0, 'Testing', 'Button 3 was pressed')
EndSelect
WEnd
Bitte.
Ich habe die DLL im Netz nicht gefunden, deshalb hab ich sie mir selbst kompiliert. Habe gehofft, dass sie mit deiner Version größtenteils übereinstimmt.
Danke vivus, werde ich zwar nicht brauchen, aber vllt jemand anderes. es ist immer gut, wenn man mehrere brauchbare Funktionen in einem Thread findet.
Du könntest ja eine richtige universale MpdbisTCP-UDF daraus machen.
BTW: Ich habe mir jetzt auch libModbus zu einer DLL kompiliert und ein paar Funktionen daraus gewrappt, um es zu testen. Läuft einwandfrei.
#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]Global $hDLL_Modbus = DllOpen("libModbus.dll")
[/autoit] [autoit][/autoit] [autoit]Global $tModbus = _Modbus_New_TCP("192.168.0.1")
If _Modbus_Connect($tModbus) = -1 Then
ConsoleWrite("! Fehler: Es konnte keine Verbindung aufgebaut werden." & @CRLF)
_Modbus_Free($tModbus)
Exit
EndIf
Global $aVal = _Modbus_Read_Registers($tModbus, 65, 2)
_ArrayDisplay($aVal)
_Modbus_Close($tModbus)
_Modbus_Free($tModbus)
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
Func _Modbus_Connect($tModbus)
Local $aRet = DllCall($hDLL_Modbus, "int:cdecl", "modbus_connect", "ptr", $tModbus)
Return $aRet[0]
EndFunc ;==>_Modbus_Connect
Func _Modbus_Close($tModbus)
DllCall($hDLL_Modbus, "none:cdecl", "modbus_close", "ptr", $tModbus)
EndFunc ;==>_Modbus_Close
Func _Modbus_Free($tModbus)
DllCall($hDLL_Modbus, "none:cdecl", "modbus_free", "ptr", $tModbus)
EndFunc ;==>_Modbus_Free
Func _Modbus_StrError($iError)
Local $aRet = DllCall($hDLL_Modbus, "str:cdecl", "modbus_strerror", "int", $iError)
Return $aRet[0]
EndFunc ;==>_Modbus_StrError
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]
For $i = 0 To $iNum - 1
$aRes[$i] = DllStructGetData($tBuffer, 1, $i + 1)
Next
Return $aRes
EndFunc ;==>_Modbus_Read_Registers
Hab jetzt noch eine Funktion für's Lesen von Bits (Inputs - Funktionscode 2) geschrieben. Hoffe, die funktioniert bei dir.
#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]TCPStartup()
[/autoit] [autoit][/autoit] [autoit]Global $ModbusTCP_Debug_Send = 1
Global $ModbusTCP_Debug_Recv = 1
Global $iSock = TCPConnect("172.18.65.159", 502)
[/autoit] [autoit][/autoit] [autoit]If $iSock = -1 Then
ConsoleWrite("Fehler Verbindungsaufbau" & @LF)
Exit
EndIf
Global $iRet = _ModbusTCP_ReadDiscreteInputs($iSock, 0, 16)
ConsoleWrite("Bits = " & $iRet & @CRLF)
TCPCloseSocket($iSock)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]TCPShutdown()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _ModbusTCP_ReadDiscreteInputs($mainsocket, $iStartAddress, $iNumOfCoils)
Local Static $TI = 0
$TI += 1
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($TI, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & $iFunctionCode & Hex($iStartAddress, 4) & Hex($iNumOfCoils, 4))
If @error Then Return SetError(2, 0, 0)
Local $sRecv
[/autoit] [autoit][/autoit] [autoit]Do
$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 _Convert_To_Binary(Int(String(BinaryMid($sRecv, 10, $iAnzahlBytes))))
EndFunc ;==>_ModbusTCP_ReadDiscreteInputs
Func _ModbusTCP_Send($mainsocket, $data)
If $ModbusTCP_Debug_Send Then ConsoleWrite("_ModbusTCP_Send(" & $mainsocket & ", """ & $data & """)" & @CRLF)
Local $Send = TCPSend($mainsocket, $data)
Return SetError(@error, 0, $Send)
EndFunc ;==>_ModbusTCP_Send
Func _ModbusTCP_Recv($mainsocket, $maxlen = 256, $flag = 0)
Local $sRecv = TCPRecv($mainsocket, $maxlen, $flag)
Local $error = @error
If $sRecv <> "" And $ModbusTCP_Debug_Recv Then ConsoleWrite("_ModbusTCP_Recv: " & $sRecv & @CRLF)
Return SetError($error, 0, $sRecv)
EndFunc ;==>_ModbusTCP_Recv
Func _Convert_To_Binary($iNumber)
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
Bitte.
Nein Schreiben musste ich noch nie. Immer nur lesen.
Hier ist eine Seite mit einer einfachen Beschreibung des Modbus-Protokolles: http://www.simplymodbus.ca/TCP.htm
Hallo vivus,
für Modbus-TCP brauchst du keine DLL. Das geht mit AutoIt auch ganz einfach.
Hier mal ein Beispiel-Code. Wird bei dir zwar so nicht laufen, aber du kannst dir daraus sicher was basteln.
#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]TCPStartup()
[/autoit] [autoit][/autoit] [autoit]Global $ModbusTCP_Debug_Send = 1
Global $ModbusTCP_Debug_Recv = 1
Global $iSock = TCPConnect("192.168.0.1", 502)
[/autoit] [autoit][/autoit] [autoit]If $iSock = -1 Then
ConsoleWrite("Fehler Verbindungsaufbau" & @LF)
Exit
EndIf
$aTest = _ModbusTCP_ReadValues($iSock, 4, 1, 4, "float") ;Functioncode 4, Register 1, Länge 4 Resiter lesen, als float zurückgeben
[/autoit] [autoit][/autoit] [autoit]TCPCloseSocket($iSock)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]TCPShutdown()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _ModbusTCP_ReadValues($mainsocket, $FC, $iStart, $iNum, $sType)
Local Static $TI = 0
$TI += 1
Local $iBytesToSend = 6
[/autoit] [autoit][/autoit] [autoit]_ModbusTCP_Send($mainsocket, "0x" & Hex($TI, 4) & "0000" & Hex($iBytesToSend, 4) & "01" & Hex($FC, 2) & Hex($iStart, 4) & Hex($iNum, 4))
If @error Then Return SetError(1, 0, 0)
Local $sRecv
[/autoit] [autoit][/autoit] [autoit]Do
$sRecv = _ModbusTCP_Recv($mainsocket, 512)
Until @error Or $sRecv <> ""
If @error Then Return SetError(2, 0, 0)
If Int(String(BinaryMid($sRecv, 1, 2))) <> $TI Then Return SetError(3, 0, 0)
[/autoit] [autoit][/autoit] [autoit]Local $iSize = 4 ; default
[/autoit] [autoit][/autoit] [autoit]Switch $sType
Case "word"
$iSize = 2
Case "float"
$iSize = 4
Case "double"
$iSize = 8
EndSwitch
Local $aRet[$iNum / ($iSize / 2)], $iTemp
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To UBound($aRet) - 1
$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_ReadValues
Func _ModbusTCP_Send($mainsocket, $data)
If $ModbusTCP_Debug_Send Then ConsoleWrite("_ModbusTCP_Send(" & $mainsocket & ", """ & $data & """)" & @CRLF)
Local $Send = TCPSend($mainsocket, $data)
Return SetError(@error, 0, $Send)
EndFunc ;==>_ModbusTCP_Send
Func _ModbusTCP_Recv($mainsocket, $maxlen = 256, $flag = 0)
Local $sRecv = TCPRecv($mainsocket, $maxlen, $flag)
Local $error = @error
If $sRecv <> "" And $ModbusTCP_Debug_Recv Then ConsoleWrite("_ModbusTCP_Recv: " & $sRecv & @CRLF)
Return SetError($error, 0, $sRecv)
EndFunc ;==>_ModbusTCP_Recv
; #FUNCTION# ====================================================================================================================
; 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 $tInt64 = DllStructCreate("INT64")
Local $tDouble = DllStructCreate("double", DllStructGetPtr($tInt64))
DllStructSetData($tInt64, 1, $iInt64)
Return DllStructGetData($tDouble, 1)
EndFunc ;==>_WinAPI_Int64ToDouble
StringRegExpReplace gibt den neuen String zurück. Diesen musst du dann auswerten oder in eine Datei schreiben.
Du schreibst ja nicht auf $sDatei!
Alles Gute zum Geburtstag!!
[url]http://www.youtube.com/watch?v=q4mJL-O5djg[/url]
Das funktioniert nicht, weil du die UDF-Funktion zum Erstellen des Controls verwendest. Und die gibt das Handle des Controls zurück und ist generell nicht kompatibel zur eingebauten Funktion GUICtrlCreateCombo().