Anbindung eines eigenen RevPi Moduls

Rund um die Software von Revolution Pi
Post Reply
User avatar
KarlZeilhofer
Posts: 63
Joined: 12 Mar 2017, 04:21
Location: Oberösterreich, Pettenbach
Contact:

Anbindung eines eigenen RevPi Moduls

Post by KarlZeilhofer »

Liebes RevPi Team,

bei den Überlegungen zum "Makerboard" bin ich mal zu dem Punkt gekommen, dass ich als Entwickler vermutlich nicht alles der ganzen Datenkette in der Hand hab.

Was ist denn von der Seite des Pictory notwendig, dass dort ein eigenes Modul eingebaut werden kann? Vermutlich wäre es für einen Entwickler am schönsten, dort ein Universalmodul auswählen zu können, wo man dann das Speicherabbild beschreiben kann. Also x Bytes diese Variable, y Bytes diese usw.

Ist es von Kunbus überhaupt geplant, dass "fremde" Module in Pictory integriert werden können? Dazu bräuchte es ja noch sowas wie eine Modul-Beschreibungs-Datei, die dann in Pictory importiert werden kann.

Macht es Sinn, für schnelle Daten auch gleich noch den Ethernetcontroller auf das Makerboard zu geben, oder ist dessen softwaremäßige Anbindung (im Coremodul) zu komplex bzw. unmöglich?

LG, Karl
User avatar
Mathias
Posts: 130
Joined: 29 Nov 2016, 10:46

Re: Anbindung eines eigenen RevPi Moduls

Post by Mathias »

Hallo Karl,
wir wollen es natürlich einem Maker ermöglichen ein eigenes IO-Modul wie das DIO zu integrieren.
Nötig ist dazu eine rap-Datei damit das Modul mit Pictory konfiguriert werden kann und ein Treiber auf dem IO-Modul der das Protokoll zum piControl-Treiber auf dem RevPi spricht.
Das müssen wir aber alles noch viel besser dokumentieren, bevor du damit anfangen kannst. Den Quellcode vom DIO möchten wir auch veröffentlichen.
Im Moment erstellen wir ein neues Image das auf Jessie basiert mit ein paar Erweiterungen in piControl und pictory. Das müssen wir erst abschließen bevor wir die Doku machen können.
Deshalb muss ich leider noch um ein paar Wochen Geduld bitten.

Gruß
Mathias
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41

Re: Anbindung eines eigenen RevPi Moduls

Post by volker »

Ich möchte nur kurz etwas zum Thema PiCtory und eigene Module sagen:
Da es dabei ja nicht nur um Hardwaremodule geht, sondern auch um "virtuelle Module" (siehe thread mit Ingo zu seinem "Weihnachtsgeschenk" unter dem Forum "Wünsche"), betrifft dies auch viele andere Nutzer:
Ja, man kann sich eigene Module definieren. Die Definitionen sind ja in einer Textdatei (*.RAP) hinterlegt. Deren Aufbau ist nicht ganz trivial und wir wollen da eigentlich noch einen RAP-Editor basteln, um das Erstellen einer korrekten RAP-Datei zu erleichtern. Es gibt auch noch keine Doku, die wir online stellen können, auch die ist aber in Arbeit. Zwischenzeitig kannst Du aber sicher kleine Änderungen selber machen (also die Anzahl der Kanäle ändern etc.) und einfahc mal damit rumspielen.
Im Prinzip beschreibt die Datei nur das Aussehen der Möglichkeiten auf der PiCtory-Oberfläche und führt dann zu einer unterschiedlichen Aufgliederung des Prozessabbildes.

Aber nur mal so: Wenn man KEINE andere Software (wie z.B. logicad) mit PiControl verwendet, sondern nur die eigenen Komponenten, dann kann man auch auf PiCtory verzeichten. PiControl läuft so oder so im Hintergrund und wird so oder so 4 KB PA bereitstellen, in die man jederzeit mit write und read Daten schreiben und lesen kann. Solange keine andere Sogftware dieselben Adressen im PA verwendet, kann man die unverwendeten Adressen jederzeit mit den PiControl-Aufrufen verwenden. Aber Vorsicht! Das ist aktuell so und keine offizielle Vorgehensweise. Es kann sein, dass in späteren Versionen von PiControl solche zugriffe dann nicht mehr erlaubt sind, um z.B. Bereiche zu schützen etc. außerdem würde man sich ohne PiCtory die Verwendbarkeit mit beliebigen anderen Systemkomponenten schnell selber zerstören und ein Austausch der SW hier in der Community würde dann immer schwierig sein, weil andere User eventuell dann die verwendeten Adressbereiche nicht frei zur Verfügung haben.
Unser RevPi Motto: Don't just claim it - make it!
User avatar
KarlZeilhofer
Posts: 63
Joined: 12 Mar 2017, 04:21
Location: Oberösterreich, Pettenbach
Contact:

Re: Anbindung eines eigenen RevPi Moduls

Post by KarlZeilhofer »

Vielen Dank für eure Antworten.

Ja, auf den Quellcode des DIO warte ich schon gespannt :)

Der Vollständigkeit halber:
Die *.rap-Dateien liegen unter /opt/KUNBUS/pictory/resources/data/rap

Hier exemplarisch das DIO Modul (RevPiDIO_20160818_1_0.rap). Wie Volker gesagt hat, ist es nicht ganz trivial, aber bei vielen Zeilen kann man sich denken, wozu die gut sind.
Alles in allem hört sich das aber schon sehr vielversprechend an!

LG, Karl

Code: Select all

{
	"id": "piDIO",
	"version": "1.0",
	"comment": [
		"",
		"",
		""
	],
	"size": "1",
	"devicetype": "LEFT_RIGHT",
	"producttype": 96,
	"input": {
        "variants": [
            {	
                "id": "001",
				"isDefault": true,
                "data": [	
					{
						"name": "I",
						"type": "BOOL",
						"offset": 0,
						"range": {
							"type": "tooltip_loop",
							"values": [0,1,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "input, bool, test",
						"edit": "2",
						"order": 1,
						"multi": 16,
						"export": true
					},
					{
						"name": "Output Status",
						"type": "WORD",
						"offset": 2,
						"range": {
							"type": "tooltip_loop",
							"values": [0,65535,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "input, word, test",
						"edit": "2",
						"order": 2,
						"export": false
					},
					{
						"name": "Status",
						"type": "WORD",
						"offset": 4,
						"range": {
							"type": "tooltip_loop",
							"values": [0,65535,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "input, word, test",
						"edit": "2",
						"order": 3,
						"export": false
					},
					{
						"name": "Counter",
						"type": "DINT",
						"offset": 6,
						"range": {
							"type": "tooltip_loop",
							"values": [0,4294967295,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "input, dint",
						"edit": "2",
						"multi": 16,
						"order": 4,
						"export": false
					}
				]
			},
			{
                "id": "002",
				"isDefault": false,
                "data": [	
					{
						"name": "Input",
						"type": "WORD",
						"offset": 0,
						"range": {
							"type": "tooltip_loop",
							"values": [0,16383,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "input, word, test",
						"edit": "2",
						"order": 1,
						"export": true
					},
					{
						"name": "Output Status",
						"type": "WORD",
						"offset": 2,
						"range": {
							"type": "tooltip_loop",
							"values": [0,65535,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "input, word, test",
						"edit": "2",
						"order": 2,
						"export": false
					},
					{
						"name": "Status",
						"type": "WORD",
						"offset": 4,
						"range": {
							"type": "tooltip_loop",
							"values": [0,65535,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "input, word, test",
						"edit": "2",
						"order": 3,
						"export": false
					},
					{
						"name": "Counter",
						"type": "DINT",
						"offset": 6,
						"range": {
							"type": "tooltip_loop",
							"values": [0,4294967295,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "input, dint",
						"edit": "2",
						"multi": 16,
						"order": 4,
						"export": false
					}
				]
			}
		]
	},
	"output": {
        "variants": [
            {	
                "id": "001",
				"isDefault": true,
                "data": [	
					{
						"name": "O",
						"type": "BOOL",
						"offset": 70,
						"range": {
							"type": "tooltip_loop",
							"values": [0,1,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "output, bool",
						"edit": "3",
						"order": 10,
						"multi": 16,
						"export": true
					},
					{
						"name": "PWM",
						"type": "USINT",
						"offset": 72,
						"range": {
							"type": "tooltip_loop",
							"values": [0,100,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "output, byte",
						"edit": "3",
						"order": 11,
						"multi": 16,
						"export": false
					}
				]
			},
			{
                "id": "002",
				"isDefault": false,
                "data": [	
					{
						"name": "Output",
						"type": "WORD",
						"offset": 70,
						"range": {
							"type": "tooltip_loop",
							"values": [0,16383,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "output, word",
						"edit": "3",
						"order": 10,
						"export": true
					},
					{
						"name": "PWM",
						"type": "USINT",
						"offset": 72,
						"range": {
							"type": "tooltip_loop",
							"values": [0,100,1]	
						},
						"default": "0",
						"unit": "",		
						"tags": "output, byte",
						"edit": "3",
						"order": 11,
						"multi": 16,
						"export": false
					}	
				]
			}
		]
	},
	"memory": [
		{
			"name": "InputMode",
			"type": "BYTE",
			"offset": 88,
			"maxsize": 0,
			"range": {
                "type": "list",
                "values": [
                    "Direct|0",
                    "Counter, rising edge|1",
                    "Counter, falling edge|2",
					"Encoder|3"
                ]
            },
			"default": "0",
			"unit": "",		
			"tags": "memory, byte",
			"edit": "3",
			"order": 20,
			"multi": 16,
			"export": false
		},
		{
			"name": "InputDebounce",
			"type": "WORD",
			"offset": 104,
			"maxsize": 0,
			"range": {
                "type": "list",
                "values": [
                    "Off|0",
                    "25us|1",
                    "750us|2",
					"3ms|3"
                ]
            },
			"default": "0",
			"unit": "",		
			"tags": "memory, word",
			"edit": "3",
			"order": 21,
			"export": false
		},
		{
			"name": "OutputPushPull",
			"type": "WORD",
			"offset": 106,
			"maxsize": 0,
			"range": {
                "type": "tooltip_loop",
                "values": [0,65535,1]
            },
			"default": "0",
			"unit": "",		
			"tags": "memory, word",
			"edit": "3",
			"order": 25,
			"export": false
		},
		{
			"name": "OutputOpenLoadDetect",
			"type": "WORD",
			"offset": 108,
			"maxsize": 0,
			"range": {
                "type": "tooltip_loop",
                "values": [0,65535,1]
            },
			"default": "0",
			"unit": "",		
			"tags": "memory, word",
			"edit": "3",
			"order": 26,
			"export": false
		},	
		{
			"name": "OutputPWMActive",
			"type": "WORD",
			"offset": 110,
			"maxsize": 0,
			"range": {
                "type": "tooltip_loop",
                "values": [0,65535,1]
            },
			"default": "0",
			"unit": "",		
			"tags": "memory, word",
			"edit": "3",
			"order": 27,
			"export": false
		},	
		{
			"name": "OutputPWMFrequency",
			"type": "BYTE",
			"offset": 112,
			"maxsize": 0,
			"range": {
                "type": "list",
                "values": [
                    "40Hz 1%|1",
                    "80Hz 2%|2",
                    "160Hz 4%|4",
                    "200Hz 5%|5",
                    "400Hz 10%|10"
				]
            },
			"default": "1",
			"unit": "",		
			"tags": "memory, byte",
			"edit": "3",
			"order": 28,
			"export": false
		}
	],
	"lang": {
		"de": {
			"INPUT": "Eingang",
			"OUTPUT": "Ausgang"
		},
		"en": {
			"INPUT": "Input",
			"OUTPUT": "Output"
		}
	}
}
Post Reply