RaspberryPI Kunbus

https://revolution.kunbus.de/
Revolution Pi ist ein offener, modularer und (kostengünstiger) Industrie-PC auf Basis des Raspberry Pi. In einem Hutschienengehäuse untergebracht, lassen sich die drei verfügbaren Basismodule mit einer Vielzahl von geeigneten I/O-Modulen und Feldbus-Gateways erweitern. Die 24V-betriebenen Module können über eine steckbare Klemmleiste angeschlossen werden und mit einem grafischen Konfigurationstool konfiguriert werden.

Wie man EPICS auf einem Kunbus-System installiert:

pi@RevPi127xx:~ $ adduser epics
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LC_TERMINAL = "iTerm2",
LC_TERMINAL_VERSION = "3.3.2",
LANG = "en_GB.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").
adduser: Only root may add a user or group to the system.

in /etc/ssh/ssh/sshd_config deaktivieren akzeptieren env

# Allow client to pass locale environment variables
#AcceptEnv LANG LC_*

als User "pi"

sudo adduser epics
add epics to sudo /etc/group

Teamviewer entfernen und System aktualisieren:

sudo apt remove teamviewer-revpi
sudo apt purge teamviewer-revpi
sudo rm sources.list.d/teamviewer-revpi.list

sudo apt update
sudo apt upgrade

als Benutzer-Epics anmelden:

mkdir EPICS
cd EPICS

die tatsächliche Base klonen:

git clone --recursive -b 7.0 https://git.launchpad.net/epics-base base-7.0.3
cd base-7.0.3
make

Zu .bashrc hinzufügen :

export EPICS_BASE=${HOME}/EPICS/base-7.0.3
export EPICS_HOST_ARCH=linux-arm
export PATH=${EPICS_BASE}/bin/${EPICS_HOST_ARCH}:${PATH}

Beispiel IOCSwitchBox an dem FHI:

mkdir FHI
cd FHI

epics@RevPi127xx:~/FHI/IOCSwitchBox $ makeBaseApp.pl -t example IOCSwitchBox
epics@RevPi127xx:~/FHI/IOCSwitchBox $ makeBaseApp.pl -i -t example IOCSwitchBox

make
epics@RevPi127xx:~/FHI/IOCSwitchBox $ ls -l
total 36
drwxr-xr-x 3 epics epics 4096 Aug 27 13:06 bin
drwxr-xr-x 4 epics epics 4096 Aug 27 13:06 configure
drwxr-xr-x 2 epics epics 4096 Aug 27 13:06 db
drwxr-xr-x 2 epics epics 4096 Aug 27 13:06 dbd
drwxr-xr-x 2 epics epics 4096 Aug 27 13:06 include
drwxr-xr-x 3 epics epics 4096 Aug 27 13:05 iocBoot
drwxr-xr-x 4 epics epics 4096 Aug 27 13:05 IOCSwitchBoxApp
drwxr-xr-x 3 epics epics 4096 Aug 27 13:06 lib
-rw-r--r-- 1 epics epics 900 Aug 27 13:05 Makefile

Start IOC

cd iocBoot/iocIOCSwitchBox/
chmod u+x st.cmd
epics@RevPi127xx:~/FHI/IOCSwitchBox/iocBoot/iocIOCSwitchBox $ ./st.cmd
#!../../bin/linux-arm/IOCSwitchBox
< envPaths
epicsEnvSet("IOC","iocIOCSwitchBox")
epicsEnvSet("TOP","/home/epics/FHI/IOCSwitchBox")
epicsEnvSet("EPICS_BASE","/home/epics/EPICS/base-7.0.3")
cd "/home/epics/FHI/IOCSwitchBox"
## Register all support components
dbLoadDatabase "dbd/IOCSwitchBox.dbd"
IOCSwitchBox_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadTemplate "db/user.substitutions"
dbLoadRecords "db/IOCSwitchBoxVersion.db", "user=epics"
dbLoadRecords "db/dbSubExample.db", "user=epics"
#var mySubDebug 1
#traceIocInit
cd "/home/epics/FHI/IOCSwitchBox/iocBoot/iocIOCSwitchBox"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.3.1-DEV
## EPICS Base built Aug 26 2019
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncExample, "user=epics"
epics> dbl
epics:IOCSwitchBox:version
epics:circle:angle
epics:line:a
epics:circle:x
epics:circle:y
epics:calcExample
epics:calcExample1
epics:calc1
epics:calcExample2
epics:calc2
epics:calcExample3
epics:calc3
epics:circle:step
epics:circle:period
epics:circle:tick
epics:compressExample
epics:aSubExample
epics:subExample
epics:line:b
epics:aiExample
epics:aiExample1
epics:ai1
epics:aiExample2
epics:ai2
epics:aiExample3
epics:ai3
epics:xxxExample
epics>

RevPi C-Code:

git clone https://github.com/RevolutionPi/piControl.git

Werkzeuge verwenden:

epics@RevPi127xx:~/REVPI/piControl $ piTest -d
Found 2 devices:

Address: 0 module type: 95 (0x5f) RevPi Core V1.2
Module is present
input offset: 113 length: 6
output offset: 119 length: 5

Address: 31 module type: 96 (0x60) RevPi DIO V1.4
Module is present
input offset: 0 length: 70
output offset: 70 length: 18

Hier ist die Dokumentation von Kunbus etwas irreführend:

-w <o>,<l>,<v>: Writes <l> bytes with value <v> (as hex) to offset <o>.
length should be one of 1|2|4.
E.g.: -w 0,4,31224205:
Write value 31224205 hex (=824328709 dez) to offset 0.
epics@RevPi12773:~/REVPI/piControl $ piTest -w 70,2,43690
Write value aaaa hex (=43690 dez) to offset 70.

Deaktivieren Sie nutzlose Dienste:

epics@RevPi127xx:~/REVPI/piControl $ sudo systemctl stop apache2
epics@RevPi127xx:~/REVPI/piControl $ sudo systemctl disable apache2

Start des NTP-Dienstes in der FHI-FEL lan. Erstellen Sie nun den "Device Support" im Beispiel. Am einfachsten im sub-record.

Fügen Sie daher den Aufruf zum DIO in ...App/src/dbSubExample.c hinzu.

(kopieren Sie die Funktion "writeData" aus dem piControl/piTest und fügen Sie den Header und in das Makefile piControlIf.c ein).

Bestimmen Sie den Offset zum Port anschließend korrekt oder bauen Sie ihn in den Init ein, das ist wirklich nur schnell und schmutzig, um zu zeigen, was Sie schnell tun können.

#include <stdio.h>

#include <dbDefs.h>
#include <registryFunction.h>
#include <subRecord.h>
#include <aSubRecord.h>
#include <epicsExport.h>

int mySubDebug;

#include "piControlIf.h"

/***********************************************************************************/
/*!
* @brief Write data to process image
*
* Write <length> bytes to a specific offset of process image.
*
* @param[in] Offset
* @param[in] Length
* @param[in] Value to write
*
************************************************************************************/
void writeData(int offset, int length, unsigned long i32uValue)
{
int rc;

if (length != 1 && length != 2 && length != 4) {
printf("Length must be one of 1|2|4\n");
return;
}
rc = piControlWrite(offset, length, (uint8_t *) & i32uValue);
if (rc < 0) {
printf("write error \n");
} else {
printf("Write value %lx hex (=%ld dez) to offset %d.\n", i32uValue, i32uValue, offset);
}
}

static long mySubInit(subRecord *precord)
"dbSubExample.c" 84 lines, 2159 characters
#include <stdio.h>

#include <dbDefs.h>
#include <registryFunction.h>
#include <subRecord.h>
#include <aSubRecord.h>
#include <epicsExport.h>

int mySubDebug;

#include "piControlIf.h"

/***********************************************************************************/
/*!
* @brief Write data to process image
*
* Write <length> bytes to a specific offset of process image.
*
* @param[in] Offset
* @param[in] Length
* @param[in] Value to write
*
************************************************************************************/
void writeData(int offset, int length, unsigned long i32uValue)
{
int rc;

if (length != 1 && length != 2 && length != 4) {
printf("Length must be one of 1|2|4\n");
return;
}
rc = piControlWrite(offset, length, (uint8_t *) & i32uValue);
if (rc < 0) {
printf("write error \n");
} else {
printf("Write value %lx hex (=%ld dez) to offset %d.\n", i32uValue, i32uValue, offset);
}
}

static long mySubInit(subRecord *precord)
{
}
}

static long mySubInit(subRecord *precord)
{
if (mySubDebug)
printf("Record %s called mySubInit(%p)\n",
precord->name, (void*) precord);

printf("Will init piRegister ..\n");
return 0;
}

static long mySubProcess(subRecord *precord)
{
if (mySubDebug)
printf("Record %s called mySubProcess(%p)\n",
precord->name, (void*) precord);
epicsUInt32 val;
val = precord->a;
printf ("write %x\n", val);
writeData(70, 2, val);
return 0;
}

static long myAsubInit(aSubRecord *precord)
{
if (mySubDebug)
printf("Record %s called myAsubInit(%p)\n",
precord->name, (void*) precord);
return 0;
}

static long myAsubProcess(aSubRecord *precord)
{
if (mySubDebug)
printf("Record %s called myAsubProcess(%p)\n",
precord->name, (void*) precord);
return 0;
}

/* Register these symbols for use by IOC code: */

epicsExportAddress(int, mySubDebug);
epicsRegisterFunction(mySubInit);
epicsRegisterFunction(mySubProcess);
epicsRegisterFunction(myAsubInit);
epicsRegisterFunction(myAsubProcess);

Dann erweitere das Makefile in src um:

# Link locally-provided code into the support library,
# rather than directly into the IOC application, that
# causes problems on Windows DLL builds
IOCSwitchBoxSupport_SRCS += dbSubExample.c
IOCSwitchBoxSupport_SRCS += devIOCSwitchBoxVersion.c
IOCSwitchBoxSupport_SRCS += IOCSwitchBoxHello.c
IOCSwitchBoxSupport_SRCS += initTrace.c

Diese muss natürlich zuerst in das Verzeichnis (mit der Header-Datei von piTest) kopiert werden.

->>>> IOCSwitchBoxSupport_SRCS += piControlIf.c

dann machen und neu starten ioc, dann ist das die Einstellung der Ausgänge:

$ caput epics:subExample.A 8

Old : epics:subExample.A 4
New : epics:subExample.A 8
Page last modified on August 30, 2019, at 10:05 AM
Powered by PmWiki