Raspberry PI (GOAL)

Changelog

Version

Changes

 

1.0

 

 

Initial release

 

1.1

 

 

Update to raspi shield

 

1.2

Change network access and login data in chapter 2.2

Chapter 2.3.2 “Pre build PN-IO app” added

Introduction

 This document describes how start with the demonstration kit combining the port SoM Arduino Shield with the Raspberry Pi 3.

Initial Setup

 The demo kit consists of

  • a Raspberry Pi 3 B+,

  • an adapter board Raspberry Header à Arduino Header,

  • the Arduino shield board containing the communication core,

  • a power supply for Raspberry Pi and

  • a software package

    • Management Tool for first steps with the device

    • Demo applications

Raspi shield board

The raspi shield board comes ready to use, no configuration is required.

Preparing the Raspberry Pi

Connect the Raspberry Pi to your local network via Ethernet. The Raspberry IP address is fixed to 192.168.0.50/24. To access the device, either connect a monitor, keyboard and mouse via the provide HDMI and USB connectors or connect to the device via SSH after bootup. Consider that ssh-service is active by default! Use the following credentials for SSH access:

  • Username: pi

  • Password: pi

Starting applications

 

1 2 cd /home/pi/pnio_app ./goal_raspberry_01_simple_io.bin

Also see section 5 for a description of example programs.

Compilation on target

The software package for the demo kit provides several examples for the AC. The examples can be compiled either on a host system or on the target. For a host based build a cross compiler toolchain is required. It is recommended to build the binaries on the target.

For compiling some requirements are needed. These can be installed using this command:

1 sudo apt-get install build-essential

In addition the SPI interface needs to be enabled using raspi-config.

1 sudo raspi-config

Under “Interface options” it os possible to enable the SPI interface.

The software package needs to be transferred to the target. This can be done using scp.

1 scp 2015013_20200930_2_21_1_port_Raspberry_CCM_ci14.zip pi@raspberrypi:

On the raspberry pi the archive needs to be extracted:

1 2 3 mkdir som cd som unzip ../2015013_20200930_2_21_1_port_Raspberry_CCM_ci14.zip

The projects to compile are available in the folder projects/2015013_irj45/ac. To compile a single project, open a shell and go to the gcc folder of a project e.g. projects/2015013_irj45/ac/01_pnio_io_mirror/.

Now run make. The compile shell will now show the selection dialog for the target platform. Choose 3 for the Raspberry Pi Shield.

For compilation call make the following way:

1 make CROSS_COMPILE=

The build system will then start to build the software. The resulting file is stored in the subfolder build/raspberry_pi_raspi_shield and name goal_raspberry_pi_raspi_shield.bin.

Start the executable as shown below. A similar log as following will show:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 pi@bit-rp4:~ $ ./01_simple_io_raspberrypi.bin GOAL Start [AC_I|goal_taskCreate:117] creating task: GOAL Timer [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_tgtTaskCreate:1185] task stack size: 8388608 byte [AC_I|goal_cmInit:220] Calculated config size of 240 in 3 modules modules [AC_I|goal_taskCreate:117] creating task: MCTC SPI process [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_tgtTaskCreate:1185] task stack size: 8388608 byte [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Read from AC', pos: 73, len: 50 [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Write to AC', pos: 73, len: 50 [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_snmpInitRpc:103] SNMP Application Core successfully started [AC_I|goal_taskCreate:117] creating task: GOAL Main [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_tgtTaskCreate:1185] task stack size: 8388608 byte [AC_I|goal_init:186] GOAL initialized [AC_W|goal_lmLogLegacy:1022] [AC_W|goal_miMctcRpcSyncLoop:980] sync needs remote reset to proceed [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miMctcRpcSyncLoop:1022] RPC state synchronized, running appl_setup [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_pnioNewAc:275] PROFINET Application Core successfully started [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:351] Initializing device structure [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:568] PROFINET ready [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:570] Configuring DD [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:594] DD ready [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:601] mapping of ctc rx data (CC -> AC) [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:605] CC: input IOCS -> AC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Read from AC', pos: 0, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:619] RX: Slot 1 Subslot 1 CS: 0 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:624] CC: output IOPS -> AC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Read from AC', pos: 1, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:638] RX: Slot 2 Subslot 1 PS: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:643] CC: input IOCS -> AC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Read from AC', pos: 2, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:657] RX: Slot 3 Subslot 1 CS: 2 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:662] CC: output IOPS -> AC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Read from AC', pos: 3, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:676] RX: Slot 4 Subslot 1 PS: 3 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:681] CC: output data -> AC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Read from AC', pos: 4, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:694] RX: Slot 2 Subslot 1 DATA: 4 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:699] CC: output data -> AC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Read from AC', pos: 5, len: 2 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:712] RX: Slot 4 Subslot 1 DATA: 5 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:717] CC: APDU -> AC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Read from AC', pos: 7, len: 4 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:723] RX: APDU : 7 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:728] CC: DP -> AC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Read from AC', pos: 11, len: 4 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:734] RX:generic data provider : 11 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:738] mapping of ctc tx data (AC -> CC) [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:742] AC: input IOPS -> CC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Write to AC', pos: 0, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:755] TX: Slot 1 Subslot 1 PS: 0 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:760] AC: output IOCS -> CC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Write to AC', pos: 1, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:773] TX: Slot 2 Subslot 1 CS: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:778] AC: input IOPS -> CC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Write to AC', pos: 2, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:791] TX: Slot 3 Subslot 1 PS: 2 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:796] AC: output IOCS -> CC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Write to AC', pos: 3, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:809] TX: Slot 4 Subslot 1 CS: 3 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:814] AC: input data -> CC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Write to AC', pos: 4, len: 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:827] TX: Slot 1 Subslot 1 DATA: 4 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:832] AC: input data -> CC [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miDmPartRegInt:275] part added to 'Write to AC', pos: 5, len: 2 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:845] TX: Slot 3 Subslot 1 DATA: 5 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_httpSetup:100] setup web server [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_dmCbCyclicRx:1010] entering safe state for Slot 4 Subslot 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_dmCbCyclicRx:1031] entering safe state for Slot 2 Subslot 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_httpNewAc:951] HTTP Application Core successfully started [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_httpSetup:178] web server setup done [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:869] CCM version : 2.0.0.0 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:870] CCM device : 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_setup:872] CCM Serial : b4:e9:a3:00:75:30 [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miMctcRpcSyncLoop:1052] local setup done [AC_I|goal_memInitDone:152] fixed memory usage: 64592/524288 bytes bytes [AC_I|goal_memInitDone:157] fixed memory usage: (13%) [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_dmCbCyclicRx:1003] entering valid state for Slot 4 Subslot 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_dmCbCyclicRx:1024] entering valid state for Slot 2 Subslot 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_loop:940] IOXS changed: 'slot 1, subslot 1, IOCS' = 0x80 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_loop:940] IOXS changed: 'slot 2, subslot 1, IOPS' = 0x80 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_loop:940] IOXS changed: 'slot 3, subslot 1, IOCS' = 0x80 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_loop:940] IOXS changed: 'slot 4, subslot 1, IOPS' = 0x80 [AC_E|goal_lmLogLegacy:1016] [AC_E|goal_miMctcMonitorRx:1289] data channel offline: MCTC SPI [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miMctcMonitorRx:1290] state : 4: [AC_I|goal_lmLogLegacy:1029] [AC_I|goal_miMctcMonitorRx:1275] data channel online: MCTC SPI [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_dmCbCyclicRx:1010] entering safe state for Slot 4 Subslot 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_dmCbCyclicRx:1031] entering safe state for Slot 2 Subslot 1 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_loop:940] IOXS changed: 'slot 1, subslot 1, IOCS' = 0x0 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_loop:940] IOXS changed: 'slot 2, subslot 1, IOPS' = 0x0 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_loop:940] IOXS changed: 'slot 3, subslot 1, IOCS' = 0x0 [AC_I|goal_lmLogLegacy:1029] [AC_I|appl_loop:940] IOXS changed: 'slot 4, subslot 1, IOPS' = 0x0

If this fails, a reset issue may affect your hardware. Please perform a reset of the SoM module and thus set a define output level for the reset signal using the following shell script:

1 2 3 4 5 6 7 8 #/usr/bin/env bash echo "13" > /sys/class/gpio/export || true sleep 1 echo "out" > /sys/class/gpio/gpio13/direction sleep 1 echo "0" > /sys/class/gpio/gpio13/value sleep 1 echo "1" > /sys/class/gpio/gpio13/value

This script will set the GPIO, where the reset signal of the SoM module is connected to a defined value. Beside that a reset is performed.

Industrial Communication Explorer

The Industrial Communication Explorer allows development related configuration and management of the application. This management is based on a UDP broadcast communication. Thus, it works independently from IP settings of the management PC and SoM.

This tool is organized in panels. The “Network Navigator” shows a list of available networks. The panel “Messages” shows information regarding actions. The panel “Outline” shows additional information depending on the selected function panel.

Following function panels are available:

Panel

Function

EtherCAT Master

Provides simple EtherCAT master functionality.

EtherNet/IP Master

Provides simple EtherNet/IP master functionality

Exception Log

Shows error messages, which are saved in the non volatile storage of the communication controller.

Device Log

Shows log messages of the running application from both communication controller (CC) and application controller (AC).

Network state

Shows link state of the available network interfaces of the SoM.

PNIO Master

Provides simple PNIO master functionality.

ConfigManager

Provides access to the config manager variables of the SoM.

Firmware Update

Allows update of the firmware of the SoM.

Device Detection

At first a communication needs to be established with the SoM. Thus, connect the SoM to the network. Between the management PC and the SoM a network connection must be possible.

To communicate with the SoM, at first open the “Networks” list in the “Network Navigator”. Choose the network interface where the SoM is reachable. Then select the “Scan Network” button in the toolbar.

The following dialog appears and 1 found device will be reported:

As a result, a new SoM will be shown in the „Network Navigator“ within the scanned network.

Please select the newly found SoM for further steps.

Logging

With the selected SoM and within the “Device Log” function panel, it is now possible to read the logging buffer using “Start reading log”. For the demo application, it shows both the log messages from the communication controller (SoM) and the application controller (Raspberry Pi). Those can be distinguished by the “Source” column, which either shows “CC” ore “AC”. A successful started application reports a successful initialization of PROFINET:

1 2 3 4 5 6 [I| goal_miMctcLoop:499] running appl_setup [I| goal_pnioNewAc:369] PROFINET Application Core successfully started [I| appl_setup:226] Initializing device structure [I| appl_setup:275] PROFINET ready [I| appl_setup:281] Configuring DD [I| appl_setup:309] DD ready

To stop logging push the button again.

Config Manager / IP Configuration

The function panel “ConfigManager” provides access to the config manager variables of the SoM (volatile and nonvolatile stored configuration variables).

To read a list of all variables, select the “Read configuration” button in the toolbar.

As a result, all variables with value are shown.

To communicate with the SoM, the IP address of it must be within the same IP network as the IP address of the Management PC IP address. Thus, choose a valid IP address and configure the SoM accordingly.

To configure an IP address, navigate to the variables of the “Module” GOAL_ID_NET. Make sure, that the variable DHCP_ENABLED is set to 0x00, as this option is prioritized. Now it is possible to configure IP, NETMASK and GW. Modify required values. Set the variable “VALID” to 0x01.

The Management Tool will show locally modified variables with a yellow highlight.

Those locally modified variables are downloaded to the SoM using the “Write configuration” button in the toolbar. When prompted if changed values shall be written, answer “Yes”. Afterwards the locally modified values are transferred to the SoM, where there are only modified in RAM. To make changes permanently, answer the following prompt with “Yes”. Modified IP settings are applicated after restart of the system (power cycle the Raspberry Pi/SoM).

Examples

01_pnio_simple_io

Please start the example “01_pnio_simple_io” according to the previous descriptions.

To establish a PROFINET communication, at first the SoM must be selected in the “Network Navigator”. Then select the function panel PNIO Master. At first use “Scan device” to detect the PROFINET device.

Use the “Wink” command to identify the connected SoM, which will be shown with a flashing “LED1” on the Arduino shield.

To establish a cyclic PROFINET communication use the I/O panel of the PNIO Master.

To continue, load the GSDML file provided with the distribution, located in “goal\appl\2015013_irj45\ac\gsdml\".

In the selector “Device Access Point” select “2-port Device”.

Afterwards press the “Connect” button. This button initiated a cyclic PROFINET communication.

If the cyclic connection failes, try to decrease the “Device Interval”. Take also a look at our Support Knowledge Base and FAQ.

The example application on the application controller will mirror the output data to the input data. I/O data can be manipulated and monitored in the I/O Data table.  Beside that if a connection is established, the “LED1” Led on the Arduino shield will be enabled.

Process data can be monitored and manipulated using the “IO Data” panel.

02_eip_io_data

Please start the example “02_eip_io_data” according to the previous description.

To establish an EtherNet/IP communication, at first the SoM must be selected in the “Network Navigator”. Then select the “EtherNet/IP Master” function panel. At first use “Scan device” to detect the EtherNet/IP device.

To establish an EtherNet/IP communication with the device, IP settings must be set according to the previous description. You can verify the current settings using the Management Tool.

To establish a cyclic EtherNet/IP communication use the “I/O Data” panel of the Master.

Default settings are compatible with the example. Press the “Connect” button. This button initiated a cyclic EtherNet/IP communication.

The example application on the application controller will mirror the output data to the input data.

I/O data can be manipulated and monitored in the I/O Data tables.  Beside that if a connection is established, the “LED1” and “LED2” Leds on the Arduino shield will both be green.

01_udp_receive

Please start the example “01_udp_receive” according to the previous description.

This example demonstrated networking from application controller. It provides a server, listening on IP address 192.168.0.25 and port 1234 and 1235. It will mirror any data received on those ports using UDP.

Please note that this example overwrites any taken IP settings for demonstration purpose.

01_http_get

Please start the example “01_http_get” according to the previous description.

Once started this example will provide simple web server functionality. It will deliver a simple web site showing the version number of the SoM.

Please consider the correct IP settings. Those can always be checked and manipulated using the management tool.