TwinCAT WebService & tame3

Zuviel Werbung?
-> Hier kostenlos registrieren
Der Tamex-Ordner ist jetzt hier: c:\inetpub\wwwroot
Wenn ich IP//tamex/index.html eingebe kommt das: siehe Anhang

Anleitung:

- Edit "tamex\resources\webservice.js" and change the parameters of the webservice to your needs --- siehe Anhang
- Copy the "tamex"-folder to your webserver with the ADS-Webservice installed --- soll das der o.g. Pfad sein ?
- Open the "plc\demo.pro" in TwinCAT 2 ("demo_TC3" is for TwinCAT 3), build and run it on your PLC --- was soll dann anders sein, als zum bereits erwähnten Bild ?
- Open "http:\\your_web_server\tamex\index.html" with your favorite browser --- siehe Anhang
 

Anhänge

  • fehler_webservice3.jpg
    fehler_webservice3.jpg
    128,7 KB · Aufrufe: 31
  • webservicejs.jpg
    webservicejs.jpg
    97,3 KB · Aufrufe: 25
Hallo Thorsten,
das sieht doch schon ganz gut aus. TcAdsWebService läuft, die Demo-Website läuft.
Wenn du nun das PLC-Programm "demo.pro" geladen hast und es läuft kannst du dir z.B. die Examples (Basic, Handles, array, ...) mit Werten der SPS anschauen.

Aus den Beispielen aus dem tamex-Ordner kannst du nun deine eigene Haus-Visualisierung bauen.
Du kannst eine SPS-Variable per Name angeben und tamex parst für dich die IndexGroup und IndexOffset, holt die Werte von der SPS und zeigt sie auf der HTML-Seite.

Viel spass beim rumspielen!
 
Zuletzt bearbeitet:
Hallo Thorsten,

anfangs habe ich auch keine Verbindung hinbekommen, ich habe allerdings auch TwinCAT 2 auf einem ARM Prozessor laufen, dazu musste das alignment umgestellt werden.

Code:
alignment (string, optional, 1|4|8)The value is used for the automatic data alignment of structures.
TwinCAT 2, x86: 1 Byte alignment
TwinCAT 2, ARM: 4 Byte alignment
TwinCAT 3: 8 Byte alignment

Schau mal nach, ob das bei dir richtig eingestellt ist, danach hat das bei mir funktioniert.

Viele Grüße
 
Den Screenshot mit den Einstellungen der webservice.js hatte ich weiter oben schon gepostet .. steht bei mir auf 1 .... x86-OS auf VM mit Xeon-CPU
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der IIS WebServer muss auf dem selben Rechner laufen wie die PLC-Runtime, also bei dir in der VM.
Der Ordner tamex stimmt schon, du siehst doch die Seite oder?
Wenn keine Kommunikation besteht, liegt es vermutlich an den Einstellungen in der webservice.js, Tippfehler, Port, ...?
Ist die PLC in RUN?
Firewall?
Sieh dir mal die Web-Konsolenausgabe von tamex durch, die loggen da brav mit.

lg Martin
 
Java? JavaScript!!! Die Programmierer in der jeweiligen Richtung beleidigen sich gegenseitig damit (=

Aber zurück zum Thema: Ich weiß nicht, ob es dir hilft, aber ich habe schon einmal ein bisschen angefangen, komme aber zeitlich nicht dazu, weiterzumachen... und ob der Code gut ist, kann ich auch nicht sagen, ich bin ebenfalls in JavaScript nicht so "heimisch".

So sieht jetzt meine Steuerung für das Licht schon einmal aus:

lichtsteuerung.png

Schnittstelle zu TwinCAT ist noch nicht final festgelegt, ich schicke eine Anforderung für Licht ein, die sich selbst nach 200 ms zurücksetzt, falls dies nicht der Fall ist, wird in der Steuerung die Variable nach 1000 ms zurückgesetzt.

Dazu habe ich bisher jquery und jquery mobile / jquery ui eingesetzt. Der Code lautet wie folgt:

Code:
<html><head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>jQuery Mobile: Theme Download</title>
	<link rel="stylesheet" href="resourcen/jquery.mobile.icons.min.css" />
	<link rel="stylesheet" href="resourcen/jquery.mobile.structure-1.4.5.min.css" />
	<script src="resourcen/jquery-1.11.1.min.js"></script>
	<script src="resourcen/jquery.mobile-1.4.5.min.js"></script>
	<script src="resourcen/tame.js"></script>
	<script>
	
		//Webservice definition for all examplesz
		var Plc, debug,
			g_b_block_update_event;
		
		// Austausch Variablen:
		var 	g_b_Licht_Wohnzimmer, 
				g_b_Licht_Esszimmer,
				g_b_Licht_Kueche,
				g_b_Licht_Gast,
				g_b_Licht_Flur;
				
		g_b_Licht_Wohnzimmer = false;
		
		// Debugmodus auf TRUE / FALSE setzen
		debug = true;
		
		function startClient(handles) {
			Plc =  TAME.WebServiceClient.createClient({
				serviceUrl: '/tcadswebservice/tcadswebservice.dll',
				//configFileUrl: 'http://192.168.1.2/tamex/resources/demo2.tpy',  //Path to the TPY file
				amsNetId: '5.37.200.188.1.1',
				amsPort: '801',       //default
				//useHandles: handles,    //use handles
				alignment: '4',       //2 default, set it to "4" if you have TC2 and an ARM based PLC device (i.e. CX90xx), to 8 with TC3
				language: 'ge',       //default, set it to "en" for english names of days and months
				onReady: pollCycl    //this function is defined in each example
				
				//$("#Licht_WZ").val("on").flipswitch( "refresh" ) ;
			});
		
		}
		
	window.onload = startClient;
		
	pollCycl = function(){
	
	
		Plc.readBool({
		name:	".o_b_012",
		jvar:	"g_b_Licht_Wohnzimmer"
		});
		Plc.readBool({
		name:	".o_b_030",
		jvar:	"g_b_Licht_Flur"
		});
		Plc.readBool({
		name:	".o_b_027",
		jvar:	"g_b_Licht_Gast"
		});
		Plc.readBool({
		name:	".o_b_014",
		jvar:	"g_b_Licht_Kueche"
		});
		Plc.readBool({
		name:	".o_b_011",
		jvar:	"g_b_Licht_Esszimmer"
		});


		console.log(g_b_Licht_Flur);
		
		// Update der Events blockieren:
		g_b_block_update_event = true;
		
		// **********************************************
		//			Checkboxes aktualisieren 
		// **********************************************
		//$( "#Licht_WZ").prop('checked', g_b_Licht_Wohnzimmer);
		
		var lichtstatus = $("#Licht_WZ");
		lichtstatus.prop("checked", g_b_Licht_Wohnzimmer);
		lichtstatus.flipswitch( "refresh" );
		
		lichtstatus  = $("#Licht_FL");
		lichtstatus.prop("checked", g_b_Licht_Flur);
		lichtstatus.flipswitch( "refresh" );
		
		lichtstatus  = $("#Licht_GA");
		lichtstatus.prop("checked", g_b_Licht_Gast);
		lichtstatus.flipswitch( "refresh" );
		
		lichtstatus  = $("#Licht_KU");
		lichtstatus.prop("checked", g_b_Licht_Kueche);
		lichtstatus.flipswitch( "refresh" );
		
		lichtstatus  = $("#Licht_EZ");
		lichtstatus.prop("checked", g_b_Licht_Esszimmer);
		lichtstatus.flipswitch( "refresh" );
		
		// Update der Events wieder zulassen:
		g_b_block_update_event = false;
		
		//Call the function again
		window.setTimeout('pollCycl()', 100); //Timeout 100 ms
	
	};


		
	$( document ).on( 'change', '#Licht_WZ', function( e ) {
		//alert(debug);
		if(!g_b_block_update_event) {
			Plc.writeBool({
				name: ".vp_b_Anf_Licht_Wohnzimmer",
				val: true,
				ocd: 200,
				oc: function() {
				Plc.writeBool({name: ".vp_b_Anf_Licht_Wohnzimmer", val: false});
					}
			});
		};
		
	});  


	$( document ).on( 'change', '#Licht_EZ', function( e ) {
		//alert(debug);
		if(!g_b_block_update_event) {
			Plc.writeBool({
				name: ".vp_b_Anf_Licht_Esszimmer",
				val: true,
				ocd: 200,
				oc: function() {
				Plc.writeBool({name: ".vp_b_Anf_Licht_Esszimmer", val: false});
					}
			});
		};
		
	});  
	
	$( document ).on( 'change', '#Licht_FL', function( e ) {
		//alert(debug);
		if(!g_b_block_update_event) {
			Plc.writeBool({
				name: ".vp_b_Anf_Licht_Flur_EG",
				val: true,
				ocd: 200,
				oc: function() {
				Plc.writeBool({name: ".vp_b_Anf_Licht_Flur_EG", val: false});
					}
			});
		};
		
	});  
	
	$( document ).on( 'change', '#Licht_KU', function( e ) {
		//alert(debug);
		if(!g_b_block_update_event) {
			Plc.writeBool({
				name: ".vp_b_Anf_Licht_Kueche",
				val: true,
				ocd: 200,
				oc: function() {
				Plc.writeBool({name: ".vp_b_Anf_Licht_Kueche", val: false});
					}
			});
		};
		
	});  
	
	$( document ).on( 'change', '#Licht_GA', function( e ) {
		//alert(debug);
		if(!g_b_block_update_event) {
			Plc.writeBool({
				name: ".vp_b_Anf_Licht_Gast",
				val: true,
				ocd: 200,
				oc: function() {
				Plc.writeBool({name: ".vp_b_Anf_Licht_Gast", val: false});
					}
			});
		};
		
	});  
		
	</script>
</head>
<body>
	<div data-role="page" data-theme="a">
		<div data-role="header" data-position="inline">
			<h1>Licht</h1>
		</div>
		<div data-role="content" data-theme="a">
		
		<a data-role="button" data-icon="bars" data-iconpos="left" href="#PopupMenu1_menu" data-rel="popup" data-transition="slidedown" id="PopupMenu1_button">Wohnzimmer</a><div data-role="popup" id="PopupMenu1_menu">
		<ul data-role="listview" data-inset="true" id="PopupMenu1" width="90%">
		<li><a href="./Licht_Erdgeschoss.html"><strong>Licht EG</strong></a></li>
		<li><strong>Licht OG</strong></li>
		</ul>
		</div>
			
			<div class="ui-field-contain">
			<fieldset data-role="controlgroup">
				<label for="Licht_WZ">Wohnzimmer:</label>
				<input type="checkbox" data-role="flipswitch" name="Licht_1" id="Licht_WZ" data-on-text="An" data-off-text="Aus">
				<label for="Licht_EZ">Esszimmer:</label>
				<input type="checkbox" data-role="flipswitch" name="Licht_2" id="Licht_EZ" data-on-text="An" data-off-text="Aus">
				<label for="Licht_KU">Küche:</label>
				<input type="checkbox" data-role="flipswitch" name="Licht_3" id="Licht_KU" data-on-text="An" data-off-text="Aus">
				<label for="Licht_GA">Gast:</label>
				<input type="checkbox" data-role="flipswitch" name="Licht_4" id="Licht_GA" data-on-text="An" data-off-text="Aus">
				<label for="Licht_FL">Flur:</label>
				<input type="checkbox" data-role="flipswitch" name="Licht_5" id="Licht_FL" data-on-text="An" data-off-text="Aus">
			</fieldset>
			</div>
			</div>
	</div>
</body>
</html>
 
Ich muss zugeben, dass ich alles in hardcoding mache... ich nutze dazu Notepad++ mit der Einstellung für HMTL / Javascript, sieht dann wie folgt aus:

notepad++_html_js.png

Der Editor kann gruppieren, Syntaxhighlighting, extrem mächtige Suchen&Ersetzen mit RegEx und mega einfache Makro-Aufzeichnung...

Wenn man keine Ahnung von nix hat, kann ich eigentlich den WYSIWYG Web Builder empfehlen, aber ich habe keine Ahnung, ob man da relativ einfach fremden JavaScript-Code oder ganze Bibliotheken einbinden kann.
 
Zuletzt bearbeitet:
Das Programm habe ich auch, aber nie dafür genutzt. Super Tip.

Ich muss erst mal durch die Variablenverknüpfung durchsteigen, bevor ich was im JS ändere. HTML ist ja kein Problem.
 
Zurück
Oben