WP_Query Object
(
    [query] => Array
        (
            [paged] => 18
            [pagename] => about-us/news
        )

    [query_vars] => Array
        (
            [paged] => 18
            [pagename] => about-us/news
            [error] => 
            [m] => 
            [p] => 0
            [post_parent] => 
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [name] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [monthnum] => 0
            [year] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [title] => 
            [fields] => 
            [menu_order] => 
            [embed] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                    [0] => 1047
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [post_name__in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

            [post_parent__in] => Array
                (
                )

            [post_parent__not_in] => Array
                (
                )

            [author__in] => Array
                (
                )

            [author__not_in] => Array
                (
                )

            [orderby] => date
            [post_type] => Array
                (
                    [0] => post
                    [1] => developer_blog
                )

            [post_status] => publish
            [order] => DESC
            [tax_query] => Array
                (
                    [0] => Array
                        (
                            [taxonomy] => blog-group
                            [field] => slug
                            [terms] => Array
                                (
                                    [0] => public
                                )

                            [operator] => IN
                        )

                    [1] => Array
                        (
                            [taxonomy] => blog-group
                            [field] => slug
                            [terms] => Array
                                (
                                    [0] => general-user
                                    [1] => technical-asociate
                                    [2] => qualified-sales-representative
                                    [3] => kvaser-internal
                                )

                            [operator] => NOT IN
                        )

                )

            [ignore_sticky_posts] => 
            [suppress_filters] => 
            [cache_results] => 1
            [update_post_term_cache] => 1
            [lazy_load_term_meta] => 1
            [update_post_meta_cache] => 1
            [posts_per_page] => 10
            [nopaging] => 
            [comments_per_page] => 50
            [no_found_rows] => 
            [taxonomy] => blog-group
            [term] => public
        )

    [tax_query] => WP_Tax_Query Object
        (
            [queries] => Array
                (
                    [0] => Array
                        (
                            [taxonomy] => blog-group
                            [terms] => Array
                                (
                                    [0] => public
                                )

                            [field] => slug
                            [operator] => IN
                            [include_children] => 1
                        )

                    [1] => Array
                        (
                            [taxonomy] => blog-group
                            [terms] => Array
                                (
                                    [0] => general-user
                                    [1] => technical-asociate
                                    [2] => qualified-sales-representative
                                    [3] => kvaser-internal
                                )

                            [field] => slug
                            [operator] => NOT IN
                            [include_children] => 1
                        )

                    [2] => Array
                        (
                            [taxonomy] => category
                            [terms] => Array
                                (
                                    [0] => 1047
                                )

                            [field] => term_id
                            [operator] => NOT IN
                            [include_children] => 
                        )

                )

            [relation] => AND
            [table_aliases:protected] => Array
                (
                    [0] => wp_term_relationships
                )

            [queried_terms] => Array
                (
                    [blog-group] => Array
                        (
                            [terms] => Array
                                (
                                    [0] => public
                                )

                            [field] => slug
                        )

                )

            [primary_table] => wp_posts
            [primary_id_column] => ID
        )

    [meta_query] => WP_Meta_Query Object
        (
            [queries] => Array
                (
                )

            [relation] => 
            [meta_table] => 
            [meta_id_column] => 
            [primary_table] => 
            [primary_id_column] => 
            [table_aliases:protected] => Array
                (
                )

            [clauses:protected] => Array
                (
                )

            [has_or_relation:protected] => 
        )

    [date_query] => 
    [queried_object] => WP_Post Object
        (
            [ID] => 1277
            [post_author] => 38
            [post_date] => 2014-11-21 12:03:40
            [post_date_gmt] => 2013-12-19 15:28:51
            [post_content] => 
            [post_title] => News
            [post_excerpt] => 
            [post_status] => publish
            [comment_status] => open
            [ping_status] => open
            [post_password] => 
            [post_name] => news
            [to_ping] => 
            [pinged] => 
            [post_modified] => 2021-08-12 09:14:30
            [post_modified_gmt] => 2021-08-12 09:14:30
            [post_content_filtered] => 
            [post_parent] => 23
            [guid] => https://www.kvaser.com/?page_id=1277
            [menu_order] => 5
            [post_type] => page
            [post_mime_type] => 
            [comment_count] => 0
            [filter] => raw
        )

    [queried_object_id] => 1277
    [request] => SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( 
  wp_term_relationships.term_taxonomy_id IN (1026) 
  AND 
  wp_posts.ID NOT IN (
				SELECT object_id
				FROM wp_term_relationships
				WHERE term_taxonomy_id IN (1025,1027,1028,1029)
			) 
  AND 
  wp_posts.ID NOT IN (
				SELECT object_id
				FROM wp_term_relationships
				WHERE term_taxonomy_id IN (1058)
			)
) AND wp_posts.post_type IN ('post', 'developer_blog') AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 170, 10
    [posts] => Array
        (
            [0] => WP_Post Object
                (
                    [ID] => 27720
                    [post_author] => 6080
                    [post_date] => 2020-04-03 08:49:13
                    [post_date_gmt] => 2020-04-03 08:49:13
                    [post_content] => 
                    [post_title] => Importance of Calibrating for High Precision Measurement
                    [post_excerpt] => 
                    [post_status] => publish
                    [comment_status] => closed
                    [ping_status] => closed
                    [post_password] => 
                    [post_name] => importance-of-calibrating-for-high-precision-measurement
                    [to_ping] => 
                    [pinged] => 
                    [post_modified] => 2022-04-04 10:19:11
                    [post_modified_gmt] => 2022-04-04 10:19:11
                    [post_content_filtered] => 
                    [post_parent] => 0
                    [guid] => https://www.kvaser.com/?p=27720
                    [menu_order] => 0
                    [post_type] => post
                    [post_mime_type] => 
                    [comment_count] => 0
                    [filter] => raw
                )

            [1] => WP_Post Object
                (
                    [ID] => 27718
                    [post_author] => 6080
                    [post_date] => 2020-04-03 07:28:00
                    [post_date_gmt] => 2020-04-03 07:28:00
                    [post_content] => 
                    [post_title] => Free Micro CANopen libraries for NXP MCUs.
                    [post_excerpt] => 
                    [post_status] => publish
                    [comment_status] => closed
                    [ping_status] => closed
                    [post_password] => 
                    [post_name] => free-micro-canopen-libraries-for-nxp-mcus
                    [to_ping] => 
                    [pinged] => 
                    [post_modified] => 2022-04-04 10:19:11
                    [post_modified_gmt] => 2022-04-04 10:19:11
                    [post_content_filtered] => 
                    [post_parent] => 0
                    [guid] => https://www.kvaser.com/?p=27718
                    [menu_order] => 0
                    [post_type] => post
                    [post_mime_type] => 
                    [comment_count] => 0
                    [filter] => raw
                )

            [2] => WP_Post Object
                (
                    [ID] => 27666
                    [post_author] => 6
                    [post_date] => 2020-03-27 21:43:18
                    [post_date_gmt] => 2020-03-27 21:43:18
                    [post_content] => [vc_row][vc_column][vc_single_image image="27667"][vc_column_text]Warwick Control is pleased to announce the latest release of the powerful tool X-Analyser.  In particular this release has enhanced features for NMEA 2000® and SAE J1939.

X-Analyser will allow you to view Parameter Group Number (PGN) packets and compare them to raw CAN data, decode the packets into fields and signals and even look for harness/connector problems shown in the CAN electrical signal.  PGN fields and signals databases are embedded in X-Analyser and can be shown as values, gauges or graphically.

On top of this, the advanced transmission features allow the user to enter the data for PGNs using high-level signals such as engine speed or ambient temperature, instead of having to work out the data field values.  This means that the user can simulate the network behaviour for:
  • A single PGN
  • An entire device
  • Or many devices on a network
In addition, there is the following enhancements to the tool:
  • NMEA 2000® Fast Packet Protocol support for both sending and receiving of NMEA 2000® messages
  • NMEA 2000® PGN and Signal Database updated
  • Signal Panel and Message Builder support for symbolic values
X-Analyser also supports CAN, LIN, CANopen and CAN FD protocols.  It supports all Kvaser CAN and LIN interfaces, and the PicoScope 2206b. You can find out more on https://www.xanalyser.co.uk/ or by emailing [email protected] . _____

Further Reading:

The CAN Protocol Tutorial Introduction to the LINbus[/vc_column_text][/vc_column][/vc_row] [post_title] => Warwick Releases Enhanced NMEA 2000® & SAE J1939 Features in X-Analyser [post_excerpt] => Warwick Control announces latest release of the powerful tool X-Analyser; includes enhanced features for NMEA2000 and SAE J1939. [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => warwick-releases-enhanced-nmea2000-sae-j1939-features-in-x-analyser [to_ping] => [pinged] => [post_modified] => 2022-04-04 10:19:11 [post_modified_gmt] => 2022-04-04 10:19:11 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=27666 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [3] => WP_Post Object ( [ID] => 27632 [post_author] => 23 [post_date] => 2020-03-25 00:48:02 [post_date_gmt] => 2020-03-25 00:48:02 [post_content] => [vc_row][vc_column][vc_single_image image="21662"][vc_column_text]Kvaser's latest software release supports .NET standard and adds further J2534 capabilities Notable changes and additions include: Python canlib package (pycanlib): Among the developments are a new wrapper for the data (canGetHandleData), allowing customers to get information after opening a channel. A bug fix now results in the IO Control returning utf-8 decoded strings instead of "bytes in string”. Kvaser Drivers for Windows SDK (canlib): Calls to canSetBusOutputControl() and canGetBusOutputControl() are now persistent across all channels in devices made within the last 5 years until power is cycled i.e. there is no cached state. Please refer to the full release notes for more information on the drivers implicated by this change. Within the driver for Kvaser’s PCI boards, the maximum number of cards has been increased from 8 to 16. There is a tutorial on how to enable CANlib in Visual Studio 2019 when creating a C# project using the .NET Standard 2.0 for both “.NET CORE” and “.NET Framework”. Support for external digital input and output triggers is a new feature of Kvaser’s ‘external’ modules i.e. the Kvaser Memorator 2xHS v2 and Kvaser Memorator Pro 5xHS. Access to external triggering is through canlib and t script. Notably, this feature can be retrofitted by updating CANlib driver, CANlib SDK and the firmware to add the I/O Pin API to both devices.  Additional J2534 support is provided in the shape of a new registry key "share canlib channels", which ignores permission errors regarding bitrate settings, in order to ensure backwards compatibility for the dll. For the full release notes, click here. All files are available for download now on the Kvaser Downloads page. [/vc_column_text][/vc_column][/vc_row] [post_title] => Kvaser’s March 2020 Software Release [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => kvasers-march-2020-software-release [to_ping] => [pinged] => [post_modified] => 2022-12-23 01:54:42 [post_modified_gmt] => 2022-12-23 01:54:42 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=27632 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [4] => WP_Post Object ( [ID] => 27407 [post_author] => 4840 [post_date] => 2020-03-19 01:51:46 [post_date_gmt] => 2020-03-19 01:51:46 [post_content] => [vc_row][vc_column][vc_column_text]The Kvaser C# wrapper for CANlib has been ported to .NET Standard. In this document, I will show you how to enable CANlib in Visual Studio 2019 when creating a C# project using the .NET Standard 2.0 for both “.NET CORE” and “.NET Framework”. This document can also be used when enabling CANlib in an existing project.[/vc_column_text][vc_column_text]This text is based on the BLOG: Using CANlib Visual Studio 2017 C#.NET It has been modified for “Visual Studio 2019” and now shows how to use the “.NET Standard 2.0” framework (and later).

Abbreviations

VS2019 - Microsoft Visual Studio 2019 (C# .NET) CANlib - Kvaser CANlib SDK[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Before we start..."][vc_column_text]First we must download and install “Kvaser CANlib SDK“ and also “Kvaser Drivers for Windows”. After you have installed CANlib, please check where Kvaser CANlib “netstandard2.0” has been installed. On my 64-bit Windows machine they are installed here:
  • c:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\
  • c:\Program Files (x86)\Kvaser\Canlib\dotnet\x64\netstandard2.0\
Please remember where you found them, as you will need this information soon. If you have the intention to create an application that supports “.NET Framework 4.6” or earlier, then you need to use “canlibCLSNET.DLL”. How to use “canlibCLSNET.DLL” is described in the blog post:Using CANlib Visual Studio 2017 C#.NET Please also install “Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019” if you haven’t done it already. (Installs by default if you install the C++ tools when installing VS2019.) Now we are ready to start Visual Studio 2019 (C#).[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Creating an empty project"][vc_column_text]Creating a project in Visual Studio can be done in many different ways; this is one way to do it. Press, “File” - “New” -”Project…”[/vc_column_text][vc_single_image image="27408"][vc_column_text]Create a “.NET Core” or “.NET Framework” project. Edit the name and the rest of the unique information and press “OK”. VS2019 now creates an application for us. It is a bit boring, just an empty form that does nothing.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Adding some code that uses CANlib (C#)"][vc_column_text]We will now add some code that uses CANlib; exactly what it does is not important in this example. For more information about how to use CANlib, please check CANlib SDK Help.[/vc_column_text][vc_header_raket header_type="h4" header="Windows Forms Designer"][vc_column_text]This information was valid 2019-11-15. Information from Microsoft: Because this is the very first preview of the designer, it isn’t yet bundled with Visual Studio and instead is available as a Visual Studio extension (“VSIX”) (download). That means that if you open a Windows Forms project targeting .NET Core in Visual Studio, it won’t have the designer support by default – you need to install the .NET Core Designer first! You can find the full article here: Introducing .NET Core Windows Forms Designer Preview 1[/vc_column_text][vc_header_raket header_type="h4" header="Editing the FORM"][vc_column_text]To add a BUTTON and a TEXTBOX, change the property “Multiline” on the textbox to true. (I will assume that you are familiar with how to add components in VS2019, so I will not show it here).[/vc_column_text][vc_row_inner][vc_column_inner width="1/2"][vc_column_text]A lot of information can be found here: After a bit of editing, we have this beautiful application.[/vc_column_text][/vc_column_inner][vc_column_inner width="1/2"][vc_single_image image="27415"][/vc_column_inner][/vc_row_inner][vc_header_raket header_type="h4" header="Editing the CODE"][vc_column_text]It still does nothing, so in the editor, double click on “button1” and add some code inside the “button1_Click” function.[/vc_column_text][vc_code_raket language="csharp" code="cHJpdmF0ZSUyMHZvaWQlMjBidXR0b24xX0NsaWNrJTI4b2JqZWN0JTIwc2VuZGVyJTJDJTIwRXZlbnRBcmdzJTIwZSUyOSUwQSU3QiUwQSUyMCUyMCUyMCUyMENhbmxpYi5jYW5TdGF0dXMlMjBSJTNCJTBBJTIwJTIwJTIwJTIwaW50JTIwViUzQiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMHRleHRCb3gxLkNsZWFyJTI4JTI5JTNCJTBBJTIwJTIwJTIwJTIwdGV4dEJveDEuVGV4dCUyMCUzRCUyMCUyMkRFTU8lMjBWUzIwMTklNUNyJTVDbiUyMiUzQiUwQSUwQSUyMCUyMCUyMCUyMENhbmxpYi5jYW5Jbml0aWFsaXplTGlicmFyeSUyOCUyOSUzQiUwQSUwQSUyMCUyMCUyMCUyMFYlMjAlM0QlMjBDYW5saWIuY2FuR2V0VmVyc2lvbkV4JTI4Q2FubGliLmNhblZFUlNJT05fQ0FOTElCMzJfUFJPRFZFUjMyJTI5JTNCJTBBJTIwJTIwJTIwJTIwaW50JTIwVjElMjAlM0QlMjAlMjhWJTIwJTI2JTIwMHhGRjAwMDAlMjklMjAlM0UlM0UlMjAxNiUzQiUwQSUyMCUyMCUyMCUyMGludCUyMFYyJTIwJTNEJTIwJTI4ViUyMCUyNiUyMDB4RkYwMCUyOSUyMCUzRSUzRSUyMDglM0IlMEElMjAlMjAlMjAlMjB0ZXh0Qm94MS5UZXh0JTIwJTJCJTNEJTIwc3RyaW5nLkZvcm1hdCUyOCUyMkZvdW5kJTIwQ0FObGliJTIwdmVyc2lvbiUyMCU3QjAlN0QuJTdCMSU3RCU1Q3IlNUNuJTIyJTJDVjElMkNWMiUyMCUyOSUzQiUwQSUwQSUyMCUyMCUyMCUyMFIlMjAlM0QlMjBDYW5saWIuY2FuR2V0TnVtYmVyT2ZDaGFubmVscyUyOG91dCUyMGludCUyME5PQyUyOSUzQiUwQSUwQSUyMCUyMCUyMCUyMHRleHRCb3gxLlRleHQlMjAlMkIlM0QlMjBzdHJpbmcuRm9ybWF0JTI4JTIyRm91bmQlMjAlN0IwJTdEJTIwY2hhbm5lbHMlNUNyJTVDbiUyMiUyQyUyME5PQyUyOSUzQiUwQSUyMCUyMCUyMCUyMHRleHRCb3gxLlRleHQlMjAlMkIlM0QlMjAlMjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJTVDciU1Q24lMjIlM0IlMEElN0QlMEE="][vc_column_text]When I try to run the application, I get multiple errors. Something is wrong as VS2019 can’t find CANlib.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Adding CANlib"][vc_column_text]In order to use CANlib in a VS2019 project, we must add information to show where VS2019 can find the CANlib  files. It is only possible to add a reference to either the x86 version or the x64 version of CANlib. However, with a minor modification in one file, we can enable both. I will show that later in this document. I will add the reference to the win32 versions. My machine defaults to x64 when using “anyCPU” but it seems to work anyway. Before we start, set the platform to “anyCPU” (for the moment, it is the only platform I have enabled by default in this application).[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h4" header="Adding “using Kvaser.CanLib;”"][vc_column_text]If we intend to create a “.NET Core” or “.NET Framework”(V4.6.1 or later) then we shall add using Kvaser.CanLib;[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h4" header="Adding Reference “Kvaser.CanLib”"][vc_column_text]In order to use CANlib in a VS2019 project, we must add information to show VS2019 where it can find Kvaser.CanLibIn my computer I found the path earlier: “c:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\”[/vc_column_text][vc_row_inner][vc_column_inner width="1/2"][vc_column_text]Right click on “References”, and select “Add Reference…” Select the wanted DLL and press OK. I selected the win32 version. (If the DLL is not visible, then select “Browse…”.)[/vc_column_text][vc_column_text]Now we can see that the “Kvaser.CanLib” reference has been added to our list of "References."[/vc_column_text][/vc_column_inner][vc_column_inner width="1/2"][vc_single_image image="27537"][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row][vc_column][vc_single_image image="27538"][vc_header_raket header_type="h4" header="Building the application"][vc_column_text]If I try to build the application, it works! (sometimes) This warning is normal, it will disappear when we add more information to the project.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h4" header="Running an application"][vc_column_text]If I run my application and press Button1, some text will appear in the text box. The application can start CANlib, and it found some interfaces. It seems to be working. However, sometimes I get a WARNING, and sometimes I get an ERROR. I am not sure why I get the warning or error, because I should always get the error. (I am running my application on a WIN64 PC calling a win32 DLL and the result should be an error. Maybe the compiler tries to save me.) There is a simple fix to this little problem, and while we fix it, we also add support for the WIN32 and WIN64 application platforms. Keep on reading ...[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Enabling CANlib for WIN32 and WIN64"][/vc_column][/vc_row][vc_row][vc_column width="1/2"][vc_column_text]So far, we have used “anyCPU” as the target CPU platform. Now we want to set it to the platforms so we can build applications for x86 (win32) or x64 (win64). Select “Configuration Manager…” Select “<New…>” and add both x86 and x64. Copy settings from “anyCPU.” I do this for both x86 and x64 and then return to the main IDE.[/vc_column_text][/vc_column][vc_column width="1/2"][vc_single_image image="27544"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Important: Use the “new” from the “Project contexts”, not from “Active solutions platform”.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Testing x86 and x64"][vc_column_text]Select “x86” and press “Start.” It works! The application starts, but I get a warning. Select “x64” and press “Start.” I got a warning, but expected an error. This is normal and will be fixed in the next section. Okay, now the situation has improved a lot. We can select the platform, and sometimes we get a warning, and sometimes an error. I said earlier that we would fix this, and now this seems to be a proper time to do that.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Setting PATH for Kvaser.CanLib WIN32/WIN64"][vc_column_text]I want VS2019 to automatically select the correct version of Kvaser.CanLib.dll when I build my project. I have found one method to do it (there might be others). The method differs depending on the project type we have created:
  • Adjusting path for “.NET CORE” projects
  • Adjusting path for “.NETFramework” projects
More information can be found here: How to: Configure projects to target platforms[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h4" header="Adjusting path for “.NET CORE” projects"][vc_column_text]We shall now edit the file “WPF_NET_CORE.csproj” (ProjName.csproj). Before editing, it looks like this:[/vc_column_text][vc_code_raket language="csharp" code="JTNDUHJvamVjdCUyMFNkayUzRCUyMk1pY3Jvc29mdC5ORVQuU2RrLldpbmRvd3NEZXNrdG9wJTIyJTNFJTBBJTIwJTIwJTNDUHJvcGVydHlHcm91cCUzRSUyMC4uLi4lMjAlMjAlM0MlMkZQcm9wZXJ0eUdyb3VwJTNFJTIwJTI4S2VlcCUyMG9yaWdpbmFsJTIwaW5mbyUyMSUyOSUwQSUwQSUyMCUyMCUzQ0l0ZW1Hcm91cCUzRSUwQSUyMCUyMCUyMCUyMCUzQ1JlZmVyZW5jZSUyMEluY2x1ZGUlM0QlMjJLdmFzZXIuQ2FuTGliJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTNDSGludFBhdGglM0VDJTNBJTVDUHJvZ3JhbSUyMEZpbGVzJTIwJTI4eDg2JTI5JTVDS3Zhc2VyJTVDQ2FubGliJTVDZG90bmV0JTVDd2luMzIlNUNuZXRzdGFuZGFyZDIuMCU1Q0t2YXNlci5DYW5MaWIuZGxsJTNDJTJGSGludFBhdGglM0UlMEElMjAlMjAlMjAlMjAlM0MlMkZSZWZlcmVuY2UlM0UlMEElMjAlMjAlM0MlMkZJdGVtR3JvdXAlM0UlMEElMEElM0MlMkZQcm9qZWN0JTNFJTBB"][vc_column_text]Keep all original info, but locate the <ItemGroup>  that handles the reference to Kvaser.CanLib.dll.   We shall now add some lines so it looks like this:[/vc_column_text][vc_code_raket language="csharp" code="JTNDUHJvamVjdCUyMFNkayUzRCUyMk1pY3Jvc29mdC5ORVQuU2RrLldpbmRvd3NEZXNrdG9wJTIyJTNFJTBBJTIwJTIwJTNDUHJvcGVydHlHcm91cCUzRSUyMC4uLi4lMjAlMjAlM0MlMkZQcm9wZXJ0eUdyb3VwJTNFJTIwJTI4S2VlcCUyMG9yaWdpbmFsJTIwaW5mbyUyMSUyOSUwQSUwQSUyMCUyMCUzQ0l0ZW1Hcm91cCUzRSUwQSUyMCUyMCUyMCUyMCUzQ1JlZmVyZW5jZSUyMEluY2x1ZGUlM0QlMjJLdmFzZXIuQ2FuTGliJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTNDSGludFBhdGglM0VDJTNBJTVDUHJvZ3JhbSUyMEZpbGVzJTIwJTI4eDg2JTI5JTVDS3Zhc2VyJTVDQ2FubGliJTVDZG90bmV0JTVDd2luMzIlNUNuZXRzdGFuZGFyZDIuMCU1Q0t2YXNlci5DYW5MaWIuZGxsJTNDJTJGSGludFBhdGglM0UlMEElMjAlMjAlMjAlMjAlM0MlMkZSZWZlcmVuY2UlM0UlMEElMjAlMjAlM0MlMkZJdGVtR3JvdXAlM0UlMEElMEElMjAlMjAlM0NJdGVtR3JvdXAlMjAlMjBDb25kaXRpb24lM0QlMjIlMjAlMjclMjQlMjhQbGF0Zm9ybSUyOSUyNyUyMCUzRCUzRCUyMCUyN3g2NCUyNyUyMCUyMiUzRSUwQSUyMCUyMCUyMCUyMCUzQ1JlZmVyZW5jZSUyMEluY2x1ZGUlM0QlMjJLdmFzZXIuQ2FuTGliJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTNDSGludFBhdGglM0VDJTNBJTVDUHJvZ3JhbSUyMEZpbGVzJTIwJTI4eDg2JTI5JTVDS3Zhc2VyJTVDQ2FubGliJTVDZG90bmV0JTVDeDY0JTVDbmV0c3RhbmRhcmQyLjAlNUNLdmFzZXIuQ2FuTGliLmRsbCUzQyUyRkhpbnRQYXRoJTNFJTBBJTIwJTIwJTIwJTIwJTNDJTJGUmVmZXJlbmNlJTNFJTBBJTIwJTIwJTNDJTJGSXRlbUdyb3VwJTNFJTBBJTBBJTNDJTJGUHJvamVjdCUzRQ=="][vc_column_text]I added an ItemGroup with a condition (x64). This ItemGroup/Reference will override the first  ItemGroup/Reference, if I have selected x64 as the platform. It is important that you add the x64  ItemGroup/Reference after the general group. When we have done this, we are ready to continue with the next step.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h4" header="Adjusting the path for “.NETFramework” projects"][/vc_column][/vc_row][vc_row][vc_column width="1/2"][vc_column_text]In my directory structure for the project, there is a file we can edit: WPF_NET_FRAMEWORK.csproj.user (%ProjName%.csproj.user) But I cannot find it! Where is the file? Okay, no problem. It is not created by default, only when needed. Let’s create it![/vc_column_text][/vc_column][vc_column width="1/2"][vc_single_image image="27590"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Open “Project” - %ProjName%_Properties (At the bottom),  go to the section “Reference Paths” and add the path to, c:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\Now, save the project and close VS2019.  When we check our project directory, we can find the file “ProjName.csproj.user”. I open it with my text editor, and it looks like this: (Please note, this file can contain a lot of information, so it is necessary to locate the part where the “ReferencePath” has been defined.)[/vc_column_text][vc_code_raket language="csharp" code="JTNGeG1sJTIwdmVyc2lvbiUzRCUyMjEuMCUyMiUyMGVuY29kaW5nJTNEJTIydXRmLTglMjIlM0YlM0UlMEElM0NQcm9qZWN0JTIwVG9vbHNWZXJzaW9uJTNEJTIyQ3VycmVudCUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnNjaGVtYXMubWljcm9zb2Z0LmNvbSUyRmRldmVsb3BlciUyRm1zYnVpbGQlMkYyMDAzJTIyJTNFJTBBJTIwJTIwJTNDUHJvcGVydHlHcm91cCUzRSUwQSUyMCUyMCUyMCUyMCUzQ1JlZmVyZW5jZVBhdGglM0VjJTNBJTVDUHJvZ3JhbSUyMEZpbGVzJTIwJTI4eDg2JTI5JTVDS3Zhc2VyJTVDQ2FubGliJTVDZG90bmV0JTVDd2luMzIlNUNuZXRzdGFuZGFyZDIuMCU1QyUzQyUyRlJlZmVyZW5jZVBhdGglM0UlMEElMjAlMjAlM0MlMkZQcm9wZXJ0eUdyb3VwJTNFJTBBJTNDJTJGUHJvamVjdCUzRQ=="][vc_column_text]We add property group declaration:[/vc_column_text][vc_code_raket language="csharp" code="JTNDUHJvcGVydHlHcm91cCUyMENvbmRpdGlvbiUzRCUyMiUyMCUyNyUyNCUyOFBsYXRmb3JtJTI5JTI3JTIwJTNEJTNEJTIwJTI3eDY0JTI3JTIwJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDUmVmZXJlbmNlUGF0aCUzRWMlM0ElNUNQcm9ncmFtJTIwRmlsZXMlMjAlMjh4ODYlMjklNUNLdmFzZXIlNUNDYW5saWIlNUNkb3RuZXQlNUN4NjQlNUNuZXRzdGFuZGFyZDIuMCU1QyUzQyUyRlJlZmVyZW5jZVBhdGglM0UlMEElMjAlM0MlMkZQcm9wZXJ0eUdyb3VwJTNF"][vc_column_text]Now my file looks like this:[/vc_column_text][vc_code_raket language="csharp" code="JTNDJTNGeG1sJTIwdmVyc2lvbiUzRCUyMjEuMCUyMiUyMGVuY29kaW5nJTNEJTIydXRmLTglMjIlM0YlM0UlMEElM0NQcm9qZWN0JTIwVG9vbHNWZXJzaW9uJTNEJTIyQ3VycmVudCUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnNjaGVtYXMubWljcm9zb2Z0LmNvbSUyRmRldmVsb3BlciUyRm1zYnVpbGQlMkYyMDAzJTIyJTNFJTBBJTIwJTIwJTNDUHJvcGVydHlHcm91cCUzRSUwQSUyMCUyMCUyMCUyMCUzQ1JlZmVyZW5jZVBhdGglM0VjJTNBJTVDUHJvZ3JhbSUyMEZpbGVzJTIwJTI4eDg2JTI5JTVDS3Zhc2VyJTVDQ2FubGliJTVDZG90bmV0JTVDd2luMzIlNUNuZXRzdGFuZGFyZDIuMCU1QyUzQyUyRlJlZmVyZW5jZVBhdGglM0UlMEElMjAlMjAlM0MlMkZQcm9wZXJ0eUdyb3VwJTNFJTBBJTIwJTIwJTNDUHJvcGVydHlHcm91cCUyMENvbmRpdGlvbiUzRCUyMiUyMCUyNyUyNCUyOFBsYXRmb3JtJTI5JTI3JTIwJTNEJTNEJTIwJTI3eDY0JTI3JTIwJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDUmVmZXJlbmNlUGF0aCUzRWMlM0ElNUNQcm9ncmFtJTIwRmlsZXMlMjAlMjh4ODYlMjklNUNLdmFzZXIlNUNDYW5saWIlNUNkb3RuZXQlNUN4NjQlNUNuZXRzdGFuZGFyZDIuMCU1QyUzQyUyRlJlZmVyZW5jZVBhdGglM0UlMEElMjAlMjAlM0MlMkZQcm9wZXJ0eUdyb3VwJTNFJTBBJTNDJTJGUHJvamVjdCUzRQ=="][vc_column_text]I added a PropertyGroup with a condition (x64). This group will override the first PropertyGroup, if I have selected x64 as the platform. It is important that you add the x64 group after the general group.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Running on platform x86 and x64"][vc_column_text]We can now select x86 (win32) and x64 (win64) as active platforms. In both cases the application starts correctly and CANlib is available and working. We have now enabled CANlib in Visual Studio 2019, created a C# project (for .NET Framework and Netstandard) and tested it for both x86 and x64.  ΟΕΔ  (Q.E.D. Quod erat demonstrandum)[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Thoughts and FAQ"][vc_column_text]Can I use anyCPU?  When I select anyCPU as a platform, I get a warning or an error! When the computer starts Visual Studio, if I have selected anyCPU, the software will decide whether to use the 32bit or 64bit version of the DLL. Yes, anyCPU might work, but if I run the built application on another machine, with a different setup, it might not work. (Selectable loading of the DLL might work, please check this external link for more information: https://stackoverflow.com/questions/108971/using-side-by-side-assemblies-to-load-the-x64-or-x32-version-of-a-dll) Safest setup?  If I select x86 (WIN32) built application, it will run on both WIN32 and WIN64 machines. Do I need x64? If your application needs it, CANlib will work perfectly, but only on WIN64 machines. However, today (2019), the majority of Windows PCs are WIN64. Microsoft Visual C++ and  Kvaser.CanLib Redistributable When installing your app on another machine (might not have Visual Studio installed), please remember to redistribute (and install) the “Microsoft Visual C++ Redistributable for Visual Studio 2019”. You will need to copy the Kvaser.CanLib.dll (x86 and/or x64) with your project executable. These dlls are not installed as part of the driver (they are part of KVASER CANlib SDK).   Thanks for reading this! If you have any questions or comments regarding this paper, please send a mail to [email protected].[/vc_column_text][/vc_column][/vc_row] [post_title] => Using CANlib Visual Studio 2019 C# .NET STANDARD 2.0 [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => using-canlib-visual-studio-2019-c-net-standard-2-0 [to_ping] => [pinged] => [post_modified] => 2022-11-18 22:56:12 [post_modified_gmt] => 2022-11-18 22:56:12 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?post_type=developer_blog&p=27407 [menu_order] => 0 [post_type] => developer_blog [post_mime_type] => [comment_count] => 0 [filter] => raw ) [5] => WP_Post Object ( [ID] => 27427 [post_author] => 23 [post_date] => 2020-02-27 20:13:45 [post_date_gmt] => 2020-02-27 20:13:45 [post_content] => [vc_row][vc_column][vc_single_image image="27437"][vc_column_text]CAN XL is a new standard that is in development by CAN in Automation (CiA), the not-for-profit association that maintains the CANopen and CANopen FD application layers. With the goal of extending CAN FD to handle extra large files (up to 2KB per data field) that are commonly encountered in applications such as radar, microphones, e-call and TCP/IP over CAN, CAN XL will offer net data rates up to 10Mbit/s, whilst maintaining the advantages of the CAN protocol, and of-course, interoperability with CAN and CAN FD. Work began on the specification in December 2018. The CAN XL Special Interest Group (SIG), chaired by Dr. Arthur Mutter from Robert Bosch, has developed the standard over a series of meetings in which more than 40 people from automotive manufacturers, suppliers and semiconductor manufacturers participated. Kvaser’s research manager, Kent Lenartsson, is a member of the CAN XL working group. The specification of the CAN XL protocol and physical layer by CiA’s CAN XL SIG is nearing completion. The next step will be to commence ISO standardization, which involves other CAN standards being updated to support CAN XL, including ISO16845, the CAN Conformance Test plan. Upcoming presentations on CAN XL include Infineon’s Magnus-Maria Hell, Chairman of the CAN XL Physical Layer Dev Committee, who will be presenting a draft of the CAN XL physical layer at the 17th International CAN Conference, in Baden Baden on March 17 & 18th, 2020.  CAN XL higher-layer functions will also be addressed in several papers.[/vc_column_text][/vc_column][/vc_row] [post_title] => CAN XL: Bridging the bitrate gap between CAN FD and Ethernet [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => can-xl-bridging-the-bitrate-gap-between-can-fd-and-ethernet [to_ping] => [pinged] => [post_modified] => 2020-02-27 20:13:45 [post_modified_gmt] => 2020-02-27 20:13:45 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=27427 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [6] => WP_Post Object ( [ID] => 27372 [post_author] => 14 [post_date] => 2020-02-25 00:20:07 [post_date_gmt] => 2020-02-25 00:20:07 [post_content] => [vc_row][vc_column][vc_column_text]
In order to create a fictional use case, let us assume that the company we are working for are installing a dangerous machine on the factory floor. The machine is surrounded by a fence with access to the machine through a single gate, see Figure 2.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/6"][/vc_column][vc_column width="2/3"][vc_single_image image="27373"][/vc_column][vc_column width="1/6"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Figure 2: Overview of installation with fence, gate sensor, and light

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]
A sensor attached to the gate monitors if the gate is opened or closed. Two warning lights have also been set up, one green and one red, these lights have two separate control wires, one for the green light and one for the red light. To turn on a light we apply a high value, to turn off the light, a low value should be applied. It is now our job to make sure that the red light is lit up whenever the gate is opened, and otherwise the green light should be lit, showing that the gate is closed. We should also send a CAN event message to our central control unit whenever the status of the gate changes. The system should also periodically send a CAN status message containing the current state of both the lights and the gate to a central control unit.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_single_image image="27374"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Figure 3: Showing the system with gate open, including Kvaser DIN Rail

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]
The central control unit should also have the possibility to send a CAN message which sets the system in test mode for a specified period of time. The periodically sent CAN status messages, as well as the CAN event messages, should both contain information showing if the system is in test mode or not. When the test mode is active, the two lights should do a fast alternation between red and green.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Creating a DBC Database"][vc_column_text]
Since we should send and receive CAN messages, let us start by creating a database (DBC file) defining the CAN messages we are going to use. All signals are defined as “Unsigned” with byteorder “Intel” and bit length of 8. No scaling is applied so “Factor” is set to one, and “Offset” is set to zero. See Table 1 for an overview of our signals.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/6"][/vc_column][vc_column width="2/3"][vc_single_image image="27375"][/vc_column][vc_column width="1/6"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Table 1: Overview of the signals and messages we have defined for our system.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Connecting the Wires"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]
At our disposal, we have a Kvaser DIN Rail connected to one digital add-on module with 16 digital outputs and 16 digital inputs. Connecting the gate sensor to a digital input, marked as DI1 on the housing, and the green and red light control wires to two digital outputs, marked as DO3 and DO8 makes this a perfect match, see Figure 4. As could be seen in the database signals, and also by looking at the schematics in Figure 4, the gate sensor is actually indicating a closed gate with a low value (zero) and an open gate with a high value (one), this is accomplished by using the pull-up resistor R3 in Figure 4.1 I/O functions in the t programming language use a pin number to access any pin on the connected I/O add-on modules. Available pins are given consecutive integer numbers starting with 0 for the first pin on the first module, 1 for the second pin on the first module, and so on until the last pin on the last module has been enumerated. Taking a look in the Kvaser DIN Rail User’s Guide and using the table shown in Figure 5, we can now define constants for our pins:
[/vc_column_text][vc_code_raket language="clike" code="JTIwJTIwY29uc3QlMjBpbnQlMjBHQVRFX1BJTiUyMCUzRCUyMDE2JTNCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTJGJTJGJTIwbGFiZWxlZCUyMERJMSUwQSUyMCUyMGNvbnN0JTIwaW50JTIwR1JFRU5fTElHSFRfUElOJTIwJTNEJTIwMiUzQiUyMCUyMCUyMCUyMCUyMCUyMCUyRiUyRiUyMGxhYmVsZWQlMjBETzMlMEElMjAlMjBjb25zdCUyMGludCUyMFJFRF9MSUdIVF9QSU4lMjAlM0QlMjA3JTNCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTJGJTJGJTIwbGFiZWxlZCUyMERPOA=="][/vc_column][/vc_row][vc_row][vc_column][vc_single_image image="27376"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Figure 4: Schematics over our gate sensor and red and green light

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/6"][/vc_column][vc_column width="2/3"][vc_single_image image="27377"][/vc_column][vc_column width="1/6"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Figure 5: Digital add-on pin enumeration taken from the Kvaser DIN Rail User’s Guide.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="The structure of our t program"][vc_column_text]
Before jumping into the details of our t program, let us first take a bird’s-eye view of a skeleton of our upcoming t program. For more information about the anatomy of a t program, please read the Kvaser t Programming Language2.
[/vc_column_text][vc_code_raket language="trx" code="JTJGJTJGJTIwVGhlJTIwZmlyc3QlMjBzZWN0aW9uJTIwaXMlMjB0aGUlMjB2YXJpYWJsZXMlMjBzZWN0aW9uJTJDJTIwd2hpY2glMjBjb250YWlucyUyMGRlZmluaXRpb25zJTIwb2YlMjAlMEElMkYlMkYlMjBnbG9iYWwlMjB2YXJpYWJsZXMlMkMlMjBjb25zdGFudHMlMkMlMjBhbmQlMjB0eXBlcyUwQXZhcmlhYmxlcyUyMCU3QiUwQSUyMCUyMGNvbnN0JTIwaW50JTIwR0FURV9QSU4lMjAlM0QlMjAxNiUzQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyRiUyRiUyMGxhYmVsZWQlMjBESTElMjAlMjAlMEElMjAlMjBjb25zdCUyMGludCUyMEdSRUVOX0xJR0hUX1BJTiUyMCUzRCUyMDIlM0IlMjAlMjAlMjAlMjAlMjAlMjAlMkYlMkYlMjBsYWJlbGVkJTIwRE8zJTBBJTIwJTIwY29uc3QlMjBpbnQlMjBSRURfTElHSFRfUElOJTIwJTNEJTIwNyUzQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyRiUyRiUyMGxhYmVsZWQlMjBETzglMEEuLi4lMEElN0QlMEElMEElMkYlMkYlMjBOZXh0JTIwd2UlMjBwbGFjZSUyMGFsbCUyMG91ciUyMHVwY29taW5nJTIwZnVuY3Rpb24lMjBkZWZpbml0aW9ucyUwQWludCUyMGdldENvbmZpZyUyOGludCUyMGNvbmZpZyU1QiU1RCUyOSUwQSU3QiUwQSUyMCUyMC4uLiUyMCUwQSU3RCUwQS4uLiUwQSUwQSUyRiUyRiUyMFRoZSUyMG5leHQlMjBzZWN0aW9uJTIwY29udGFpbnMlMjBhbGwlMjBvdXIlMjBldmVudCUyMGhvb2tzJTJDJTIwaS5lLiUyMHBpZWNlcyUyMG9mJTIwY29kZSUyMHRoYXQlMEElMkYlMkYlMjByZXNwb25zZSUyMHRvJTIwc3BlY2lmaWMlMjBldmVudHMuJTBBJTJGJTJGJTIwVGhlJTIwZmlyc3QlMjBldmVudCUyMGhvb2slMjBpcyUyMHRoZSUyMG9uJTIwVGltZXIlMjBob29rJTJDJTIwdGhpcyUyMGNvZGUlMjBpcyUyMHJ1biUyMHdoZW4lMjB0aGUlMjB0aW1lciUyMCUwQSUyRiUyRiUyMHNwZWNpZmllZCUyMGJ5JTIwdGhlJTIwdGltZXIlMjBhcmd1bWVudCUyMGV4cGlyZXMlMEFvbiUyMFRpbWVyJTIwc3RhdHVzTWVzc2FnZVRpbWVyJTIwJTdCJTBBJTIwJTIwLi4uJTBBJTdEJTBBLi4uJTBBJTBBJTJGJTJGJTIwVGhlJTIwb24lMjBJb0V2ZW50JTIwY29kZSUyMGJsb2NrJTIwaXMlMjBleGVjdXRlZCUyMHdoZW4lMjB0aGUlMjBzcGVjaWZpZWQlMjBJJTJGTyUyMGV2ZW50JTIwYXJyaXZlcy4lMEFvbiUyMElvRXZlbnQlMjAlM0MwJTNFJTIwa3ZJT19FVkVOVF9DT05GSUdfQ0hBTkdFRCUyMCU3QiUwQSUyMCUyMC4uLiUwQSU3RCUwQS4uLiUwQSUwQSUyRiUyRiUyMFRoZSUyMG9uJTIwQ2FuTWVzc2FnZSUyMGNvZGUlMjBibG9jayUyMGlzJTIwZXhlY3V0ZWQlMjB3aGVuJTIwdGhlJTIwc3BlY2lmaWVkJTIwQ0FOJTIwbWVzc2FnZSUyMCUwQSUyRiUyRiUyMGFycml2ZXMuJTBBb24lMjBDYW5NZXNzYWdlJTIwU2V0TW9kZSUyMCU3QiUwQSUyMCUyMC4uLiUwQSU3RCUwQSUwQSUyRiUyRiUyMFRoZSUyMG9uJTIwc3RhcnQlMjBjb2RlJTIwYmxvY2slMjBpcyUyMHJ1biUyMHdoZW4lMjBwcm9ncmFtJTIwZXhlY3V0aW9uJTIwc3RhcnRzLiUwQW9uJTIwc3RhcnQlMjAlN0IlMEElMjAlMjBwcmludGYlMjglMjItLS0tLS0tLS0tLS0tLS0tJTIwdCUyMHByb2dyYW0lMjBzdGFydGVkJTIwLS0tLS0tLS0tLS0tLS0tLS0lNUNuJTIyJTI5JTNCJTBBJTIwJTIwLi4uJTBBJTdEJTBBJTBBJTJGJTJGJTIwVGhlJTIwb24lMjBzdG9wJTIwY29kZSUyMGJsb2NrJTIwaXMlMjBydW4lMjB3aGVuJTIwcHJvZ3JhbSUyMGV4ZWN1dGlvbiUyMGlzJTIwc3RvcHBlZC4lMEFvbiUyMHN0b3AlMjAlN0IlMEElMjAlMjAuLi4lMEElN0Q="][vc_column_text]

Listing 5: The bird’s-eye view of the structure of our upcoming t program.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Confirming the Configuration"][vc_column_text]
Before being able to access the I/O pins through reading and writing, we need to confirm the configuration by calling the function kvIoConfirmConfig(). This step is a required safety precaution in order to prevent our program to tinker with I/O pins if someone downloads the wrong program to the wrong Kvaser DIN Rail, controlling something completely different. It is possible to e.g. compare the serial numbers of the add-on modules to a list of known serial numbers, but in our example we are content with just verifying the number and types of add-on modules connected. In order to confirm the I/O configuration, we first find out what add-on modules that are currently connected to our Kvaser DIN Rail. This is done in a getConfig function, as shown in Listing 6. The getConfig function fills in the module type it finds in the supplied config[] argument.
[/vc_column_text][vc_code_raket language="trx" code="aW50JTIwZ2V0Q29uZmlnJTI4aW50JTIwY29uZmlnJTVCJTVEJTI5JTBBJTJGJTJGJTIwRmlsbCUyMHRoZSUyMGNvbmZpZyUyMGFycmF5JTIwd2l0aCUyMHRoZSUyMG1vZHVsZSUyMHR5cGUlMjBvZiUyMGNvbm5lY3RlZCUyMGFkZC1vbiUyMG1vZHVsZXMlMEElN0IlMEElMjAlMjBpbnQlMjBtb2R1bGVUeXBlJTNCJTBBJTIwJTIwaW50JTIwc3RhdHVzJTNCJTBBJTIwJTIwaW50JTIwcGluQ291bnQlM0IlMEElMEElMjAlMjBwcmludGYlMjglMjJSZWFkaW5nJTIwSSUyRk8lMjBDb25maWd1cmF0aW9uJTVDbiUyMiUyOSUzQiUwQSUyMCUyMCUyRiUyRiUyMGdldCUyMHRoZSUyMHRvdGFsJTIwbnVtYmVyJTIwb2YlMjBwaW5zJTIwY29ubmVjdGVkJTIwdG8lMjBvdXIlMjBLdmFzZXIlMjBESU4lMjBSYWlsJTBBJTIwJTIwc3RhdHVzJTIwJTNEJTIwa3ZJb0dldE51bWJlck9mUGlucyUyOCUyNnBpbkNvdW50JTI5JTNCJTBBJTIwJTIwaWYlMjAlMjhzdGF0dXMlMjklMjAlN0IlMEElMjAlMjAlMjAlMjBwcmludGYlMjglMjJFUlJPUiUzQSUyMGt2SW9HZXROdW1iZXJPZlBpbnMlMjBmYWlsZWQlMjB3aXRoJTIwc3RhdHVzJTIwJTI1ZCU1Q24lMjIlMkMlMjBzdGF0dXMlMjklM0IlMEElMjAlMjAlMjAlMjByZXR1cm4lMjBzdGF0dXMlM0IlMEElMjAlMjAlN0QlMEElMjAlMjBwcmludGYlMjglMjJJbiUyMHRvdGFsJTIwJTI1ZCUyMEklMkZPJTIwcGlucyUyMHdhcyUyMGZvdW5kJTVDbiUyMiUyQyUyMHBpbkNvdW50JTI5JTNCJTBBJTIwJTIwaWYlMjAlMjhwaW5Db3VudCUyMCUzQyUyMDElMjklMjAlN0IlMEElMjAlMjAlMjAlMjByZXR1cm4lMjAwJTNCJTBBJTIwJTIwJTdEJTBBJTIwJTIwaW50JTIwcGluSW5kZXglMjAlM0QlMjAwJTNCJTBBJTIwJTIwaW50JTIwbW9kdWxlSW5kZXglMjAlM0QlMjAwJTNCJTBBJTIwJTIwJTJGJTJGJTIwbG9vcCUyMHRocm91Z2glMjB0aGUlMjBmaXJzdCUyMHBpbiUyMG9mJTIwZXZlcnklMjBjb25uZWN0ZWQlMjBhZGQtb24lMjBtb2R1bGUlMkMlMjBmaW5kaW5nJTIwb3V0JTBBJTIwJTIwJTJGJTJGJTIwd2hhdCUyMGFkZC1vbiUyMG1vZHVsZXMlMjB0aGF0JTIwYXJlJTIwY29ubmVjdGVkJTBBJTIwJTIwZG8lMjAlN0IlMEElMjAlMjAlMjAlMjBzdGF0dXMlMjAlM0QlMjBrdklvUGluR2V0SW5mbyUyOHBpbkluZGV4JTJDJTIwa3ZJT19JTkZPX0dFVF9NT0RVTEVfVFlQRSUyQyUyMCUyNm1vZHVsZVR5cGUlMjklM0IlMEElMjAlMjAlMjAlMjBpZiUyMCUyOHN0YXR1cyUyOSUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMHByaW50ZiUyOCUyMkVSUk9SJTNBJTIwa3ZJb0dldE51bWJlck9mUGlucyUyMGZhaWxlZCUyMHdpdGglMjBzdGF0dXMlMjAlMjVkJTVDbiUyMiUyQyUyMHN0YXR1cyUyOSUzQiUwQSUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMHN0YXR1cyUzQiUwQSUyMCUyMCUyMCUyMCU3RCUwQSUyMCUyMCUyMCUyMCUyRiUyRiUyMHNhdmUlMjB0aGUlMjB0eXBlJTIwb2YlMjB0aGUlMjBhZGQtb24lMjBtb2R1bGUlMjBmb3VuZCUwQSUyMCUyMCUyMCUyMGNvbmZpZyU1Qm1vZHVsZUluZGV4JTVEJTIwJTNEJTIwbW9kdWxlVHlwZSUzQiUwQSUyMCUyMCUyMCUyMCUyRiUyRiUyMGZpbmQlMjBvdXQlMjBob3clMjBtYW55JTIwcGlucyUyMHRoaXMlMjB0eXBlJTIwb2YlMjBhZGQtb24lMjBtb2R1bGUlMjBoYXMlMEElMjAlMjAlMjAlMjBpbnQlMjBtb2R1bGVQaW5Db3VudCUyMCUzRCUyMGdldE1vZHVsZVBpbkNvdW50JTI4bW9kdWxlVHlwZSUyOSUzQiUwQSUyMCUyMCUyMCUyMHByaW50ZiUyOCUyMk1vZHVsZSUyMHR5cGUlMjAlMjVkJTIwYXQlMjBwaW4lMjAlMjVkJTJDJTIwaGFzJTIwJTI1ZCUyMHBpbnMlNUNuJTIyJTJDJTIwbW9kdWxlVHlwZSUyQyUyMHBpbkluZGV4JTJDJTIwbW9kdWxlUGluQ291bnQlMjklM0IlMEElMjAlMjAlMjAlMjAlMkYlMkYlMjBpbmNyZWFzZSUyMHRoZSUyMHBpbkluZGV4JTIwdG8lMjBwb2ludCUyMGF0JTIwdGhlJTIwZmlyc3QlMjBwaW4lMjBhZnRlciUyMHRoZSUyMGN1cnJlbnQlMjBtb2R1bGUlMEElMjAlMjAlMjAlMjBwaW5JbmRleCUyMCUyQiUzRCUyMG1vZHVsZVBpbkNvdW50JTNCJTBBJTIwJTIwJTIwJTIwbW9kdWxlSW5kZXglMkIlMkIlM0IlMEElMjAlMjAlN0QlMjB3aGlsZSUyMCUyOHBpbkluZGV4JTIwJTNDJTIwcGluQ291bnQlMjklM0IlMEElN0Q="][vc_column_text]

Listing 6: Function that fills an array with the module types found of all connected add-on modules.

[/vc_column_text][vc_column_text]In order not to have to loop through all pins, we called getModulePinCount(moduleType) in Listing 6. This function simply returns the number of pins a specific type of add-on module has, see Listing 7.[/vc_column_text][vc_code_raket language="trx" code="aW50JTIwZ2V0TW9kdWxlUGluQ291bnQlMjhpbnQlMjBtb2R1bGVUeXBlJTI5JTBBJTJGJTJGJTIwUmV0dXJuJTIwdGhlJTIwbnVtYmVyJTIwb2YlMjBwaW5zJTIwdGhhdCUyMGElMjBzcGVjaWZpYyUyMG1vZHVsZSUyMHR5cGUlMjBoYXMuJTBBJTdCJTBBJTIwJTIwJTJGJTJGJTIwZGVmYXVsdCUyMHBpbiUyMGNvdW50JTIwdXNlZCUyMGZvciUyMHVua25vd24lMjBtb2R1bGVzJTBBJTIwJTIwaW50JTIwcGluQ291bnQlMjAlM0QlMjAxMDAlM0IlMEElMjAlMjBzd2l0Y2glMjAlMjhtb2R1bGVUeXBlJTI5JTIwJTdCJTBBJTBBJTIwJTIwY2FzZSUyMGt2SU9fTU9EVUxFX1RZUEVfRElHSVRBTCUzQSUwQSUyMCUyMCUyMCUyMHByaW50ZiUyOCUyMkRpZ2l0YWwlMjBtb2R1bGUlMjBmb3VuZC4lNUNuJTIyJTI5JTNCJTBBJTIwJTIwJTIwJTIwcGluQ291bnQlMjAlM0QlMjAzMiUzQiUyMCUyMCUyRiUyRiUyMDE2JTIwRGlnaXRhbCUyME91dHB1dHMlMkMlMjAxNiUyMERpZ2l0YWwlMjBJbnB1dHMlMEElMjAlMjAlMjAlMjBicmVhayUzQiUwQSUwQSUyMCUyMGNhc2UlMjBrdklPX01PRFVMRV9UWVBFX0FOQUxPRyUzQSUwQSUyMCUyMCUyMCUyMHByaW50ZiUyOCUyMkFuYWxvZyUyMG1vZHVsZSUyMGZvdW5kLiU1Q24lMjIlMjklM0IlMEElMjAlMjAlMjAlMjBwaW5Db3VudCUyMCUzRCUyMDglM0IlMjAlMjAlMkYlMkYlMjA0JTIwQW5hbG9nJTIwT3V0cHV0cyUyQyUyMDQlMjBBbmFsb2clMjBJbnB1dHMlMEElMjAlMjAlMjAlMjBicmVhayUzQiUwQSUwQSUyMCUyMGNhc2UlMjBrdklPX01PRFVMRV9UWVBFX1JFTEFZJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyUmVsYXklMjBtb2R1bGUlMjBmb3VuZC4lNUNuJTIyJTI5JTNCJTBBJTIwJTIwJTIwJTIwcGluQ291bnQlMjAlM0QlMjAxNiUzQiUyMCUyMCUyRiUyRiUyMDglMjBSZWxheSUyME91dHB1dHMlMkMlMjA4JTIwRGlnaXRhbCUyME91dHB1dHMlMEElMjAlMjAlMjAlMjBicmVhayUzQiUwQSUwQSUyMCUyMGRlZmF1bHQlM0ElMEElMjAlMjAlMjAlMjBwcmludGYlMjglMjJFUlJPUiUzQSUyMFVua25vd24lMjBtb2R1bGUlMjB0eXBlJTNBJTIwJTI1ZCUyQyUyMGFzc3VtaW5nJTIwaXQlMjBoYXMlMjAlMjVkJTIwcGlucy4lNUNuJTIyJTJDJTIwbW9kdWxlVHlwZSUyQyUyMHBpbkNvdW50JTI5JTNCJTBBJTIwJTIwJTIwJTIwYnJlYWslM0IlMEElMjAlMjAlN0QlMEElMjAlMjByZXR1cm4lMjBwaW5Db3VudCUzQiUwQSU3RA=="][vc_column_text]

Listing 7: Helper function that returns the number of I/O pins a specific add-on module type has.

[/vc_column_text][vc_column_text]
We also need to specify what add-on modules we are expecting. Let’s create a new function, see Listing 8, that holds the specification of expected add-on modules, as well as calls the previous getConfig function in order to read out the actual add-on modules connected to our Kvaser DIN Rail.
[/vc_column_text][vc_code_raket language="trx" code="dm9pZCUyMHZlcmlmeUFuZENvbmZpcm1Db25maWclMjh2b2lkJTI5JTBBJTJGJTJGJTIwVmVyaWZ5JTIwdGhhdCUyMHRoZSUyMGNvbm5lY3RlZCUyMGFkZC1vbiUyMG1vZHVsZXMlMjBhcmUlMjB0aGUlMjBvbmVzJTIwd2UlMjBleHBlY3RlZCUwQSU3QiUwQSUyMCUyMCUyRiUyRiUyMGRlZmluZSUyMHdoYXQlMjBJJTJGTyUyMG1vZHVsZXMlMjB0aGUlMjBwcm9ncmFtJTIwZXhwZWN0cyUyQyUyMHdlJTIwZXhwZWN0JTIwYSUyMHNpbmdsZSUyMERpZ2l0YWwlMEElMjAlMjAlMkYlMkYlMjBhZGQtb24lMjBtb2R1bGUlMEElMjAlMjBpbnQlMjBleHBlY3RlZENvbmZpZyU1QjQlNUQlMjAlM0QlMjAlN0IlMEElMjAlMjAlMjAlMjBrdklPX01PRFVMRV9UWVBFX0RJR0lUQUwlMkMlMEElMjAlMjAlMjAlMjAwJTJDJTBBJTIwJTIwJTIwJTIwMCUyQyUwQSUyMCUyMCUyMCUyMDAlMEElMjAlMjAlN0QlM0IlMEElMEElMjAlMjAlMkYlMkYlMjByZWFkJTIwb3V0JTIwdGhlJTIwY29ubmVjdGVkJTIwSSUyRk8lMjBtb2R1bGVzJTBBJTIwJTIwaW50JTIwY29uZmlnJTVCNCU1RCUyMCUzRCUyMCU3QjAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlN0QlM0IlMEElMjAlMjBnZXRDb25maWclMjhjb25maWclMjklM0IlMEElMEElMjAlMjAlMkYlMkYlMjBjb21wYXJlJTIwaWYlMjB0aGUlMjBsaXN0JTIwb2YlMjBjb25uZXRlZCUyMG1vZHVsZXMlMjBpcyUyMGVxdWFsJTIwdG8lMjBvdXIlMjBleHBlY3RhdGlvbiUwQSUyMCUyMGludCUyMHJlc3VsdCUyMCUzRCUyMGNvbXBhcmVBcnJheSUyOGNvbmZpZyUyQyUyMGV4cGVjdGVkQ29uZmlnJTI5JTNCJTBBJTIwJTIwaWYlMjAlMjhyZXN1bHQlMjklMjAlN0IlMEElMjAlMjAlMjAlMjBwcmludGYlMjglMjJFUlJPUiUzQSUyMFVuZXhwZWN0ZWQlMjBDb25maWclMjAlMjhkaWZmZXIlMjBpbiUyMHBvc2l0aW9uJTIwJTI1ZCUyOSUyQyUyMGFsZXJ0JTIwdXNlci4uLiU1Q24lMjIlMkMlMjByZXN1bHQlMjAtJTIwMSUyOSUzQiUwQSUyMCUyMCUyMCUyMHByaW50ZiUyOCUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyNWQlMjB2cyUyMCUyNWQlNUNuJTIyJTJDJTIwY29uZmlnJTVCcmVzdWx0JTVEJTJDJTIwZXhwZWN0ZWRDb25maWclNUJyZXN1bHQlNUQlMjklM0IlMEElMjAlMjAlMjAlMjAlMkYlMkYlMjBzdG9wJTIwcnVubmluZyUyMGJ5JTIwdHJpZ2dlcmluZyUyMGFuJTIwZXhlcHRpb24lMjAlM0ItJTI5JTBBJTIwJTIwJTIwJTIwaW50JTIwZHVtbXklMjAlM0QlMjAxJTIwJTJGJTIwMCUzQiUwQSUyMCUyMCU3RCUyMGVsc2UlMjAlN0IlMEElMjAlMjAlMjAlMjAlMkYlMkYlMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwd2FzJTIwYXMlMjBleHBlY3RlZCUyQyUyMGNvbmZpcm0lMjBJJTJGTyUyMGNvbmZpZyUyMGFuZCUyMGNvbnRpbnVlJTBBJTIwJTIwJTIwJTIwJTJGJTJGJTIwcnVubmluZy4uLiUwQSUyMCUyMCUyMCUyMGludCUyMHN0YXR1cyUyMCUzRCUyMGt2SW9Db25maXJtQ29uZmlnJTI4JTI5JTNCJTBBJTIwJTIwJTIwJTIwaWYlMjAlMjhzdGF0dXMlMjklMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjBwcmludGYlMjglMjJFUlJPUiUzQSUyMGt2SW9Db25maXJtQ29uZmlnJTIwZmFpbGVkJTIwd2l0aCUyMHN0YXR1cyUyMCUyNWQlNUNuJTIyJTJDJTIwc3RhdHVzJTI5JTNCJTBBJTIwJTIwJTIwJTIwJTdEJTBBJTIwJTIwJTdEJTBBJTdE"][vc_column_text]

Listing 8: Function that verifies and confirms the configuration if we have one single Digital add-on connected.

[/vc_column_text][vc_column_text]
The last piece in the configuration confirmation puzzle is the compareArray() function we used in Listing 8 to do the actual comparison between expected and found module types, see Listing 9.
[/vc_column_text][vc_code_raket language="trx" code="aW50JTIwY29tcGFyZUFycmF5JTI4aW50JTIwYXJyYXlBJTVCJTVEJTJDJTIwaW50JTIwYXJyYXlCJTVCJTVEJTI5JTBBJTJGJTJGJTIwQ29tcGFyZXMlMjB0d28lMjBhcnJheXMlMkMlMjByZXR1cm5zJTIwMCUyMGlmJTIwdGhleSUyMGFyZSUyMGVxdWFsJTJDJTBBJTJGJTJGJTIwcmV0dXJucyUyMC0xJTIwaWYlMjBsZW5ndGglMjBkaWZmZXJzJTJDJTBBJTJGJTJGJTIwZWxzZSUyMHJldHVybnMlMjB0aGUlMjBmaXJzdCUyMGluZGV4JTIwJTI4c3RhcnRpbmclMjBhdCUyMDElMjklMjB0aGF0JTIwZGlmZmVyJTBBJTdCJTBBJTIwJTIwaWYlMjAlMjhhcnJheUEuY291bnQlMjAlMjElM0QlMjBhcnJheUIuY291bnQlMjklMjAlN0IlMEElMjAlMjAlMjAlMjByZXR1cm4lMjAtMSUzQiUwQSUyMCUyMCU3RCUwQSUyMCUyMGZvciUyMCUyOGludCUyMGklMjAlM0QlMjAwJTIwJTNCJTIwaSUyMCUzQyUyMGFycmF5QS5jb3VudCUyMCUzQiUyMGklMkIlMkIlMjklMjAlN0IlMEElMjAlMjAlMjAlMjBpZiUyMCUyOGFycmF5QSU1QmklNUQlMjAlMjElM0QlMjBhcnJheUIlNUJpJTVEJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwaSUyMCUyQiUyMDElM0IlMEElMjAlMjAlMjAlMjAlN0QlMEElMjAlMjAlN0QlMEElMjAlMjByZXR1cm4lMjAwJTNCJTBBJTdE"][vc_column_text]

Listing 9: Function that compares to arrays and returns the first position that differs, or -1 if the length differs.

[/vc_column_text][vc_column_text]
We can now call verifyAndConfirmConfig() from inside the on start hook, but there’s one caveat. If we want to start our t program at power-on, the current version of the FW (v3.16) has not yet found any I/O modules when the on start hook is executed so this will fail. The workaround is to also place the configuration confirmation inside a kvIO_EVENT_CONFIG_CHANGED hook as shown in Listing 10. The kvIO_EVENT_CONFIG_CHANGED hook will run whenever an add-on module is added or removed, as well as during power on.
[/vc_column_text][vc_code_raket language="trx" code="b24lMjBJb0V2ZW50JTIwJTNDMCUzRSUyMGt2SU9fRVZFTlRfQ09ORklHX0NIQU5HRUQlMjAlN0IlMEElMjAlMjB2ZXJpZnlBbmRDb25maXJtQ29uZmlnJTI4JTI5JTNCJTBBJTIwJTIwc2V0TGlnaHQlMjhMSUdIVF9CT1RIJTI5JTNCJTBBJTdE"][vc_column_text]

Listing 10: Placing call to verifyAndConfirmConfig() inside the “on IoEvent” makes the verifying code run whenever needed, including at boot up.

[/vc_column_text][vc_column_text]
Here we also caught a glimpse of the setLight() function which we will implement next in order to control the lights.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Make the Lights Turn On and Off"][vc_column_text]
When the I/O configuration has been confirmed, we may read and set our I/O ports using kvIoPinSetDigital(). To make it easier to read our code, we first define a number of constants specifying the different states our two lights can be set to.
[/vc_column_text][vc_code_raket language="trx" code="JTIwJTIwJTJGJTJGJTIwY29uc3RhbnRzJTIwdXNlZCUyMGluJTIwdGhlJTIwc2V0TGlnaHQlMjglMjklMjBmdW5jdGlvbiUwQSUyMCUyMGNvbnN0JTIwaW50JTIwTElHSFRfT0ZGJTIwJTNEJTIwMCUzQiUwQSUyMCUyMGNvbnN0JTIwaW50JTIwTElHSFRfR1JFRU4lMjAlM0QlMjAxJTNCJTBBJTIwJTIwY29uc3QlMjBpbnQlMjBMSUdIVF9SRUQlMjAlM0QlMjAyJTNCJTBBJTIwJTIwY29uc3QlMjBpbnQlMjBMSUdIVF9CT1RIJTIwJTNEJTIwMyUzQg=="][vc_column_text]
We then create the setLight() function, see Listing 11, that will set the digital I/O pins as needed, in order to turn the green and red light on and off as indicated by the incoming parameter.
[/vc_column_text][vc_code_raket language="trx" code="dm9pZCUyMHNldExpZ2h0JTI4aW50JTIwbGlnaHRTZXR0aW5nJTI5JTBBJTJGJTJGJTIwU2V0JTIwZ3JlZW4lMjBhbmQlMjByZWQlMjBsaWdodCUyMGFjY29yZGluZyUyMHRvJTIwaW5jb21pbmclMjBhcmd1bWVudC4lMEElN0IlMEElMjAlMjBpbnQlMjBzdGF0dXMlM0IlMEElMjAlMjBpbnQlMjBncmVlbkxpZ2h0VmFsdWUlMjAlM0QlMjAwJTNCJTBBJTIwJTIwaW50JTIwcmVkTGlnaHRWYWx1ZSUyMCUzRCUyMDAlM0IlMEElMEElMjAlMjBzd2l0Y2glMjAlMjhsaWdodFNldHRpbmclMjklMjAlN0IlMEElMEElMjAlMjAlMjAlMjBjYXNlJTIwTElHSFRfT0ZGJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwZ3JlZW5MaWdodFZhbHVlJTIwJTNEJTIwMCUzQiUwQSUyMCUyMCUyMCUyMCUyMCUyMHJlZExpZ2h0VmFsdWUlMjAlM0QlMjAwJTNCJTBBJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslM0IlMEElMjAlMjAlMjAlMjBjYXNlJTIwTElHSFRfR1JFRU4lM0ElMEElMjAlMjAlMjAlMjAlMjAlMjBncmVlbkxpZ2h0VmFsdWUlMjAlM0QlMjAxJTNCJTBBJTIwJTIwJTIwJTIwJTIwJTIwcmVkTGlnaHRWYWx1ZSUyMCUzRCUyMDAlM0IlMEElMjAlMjAlMjAlMjAlMjAlMjBicmVhayUzQiUwQSUyMCUyMCUyMCUyMGNhc2UlMjBMSUdIVF9SRUQlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjBncmVlbkxpZ2h0VmFsdWUlMjAlM0QlMjAwJTNCJTBBJTIwJTIwJTIwJTIwJTIwJTIwcmVkTGlnaHRWYWx1ZSUyMCUzRCUyMDElM0IlMEElMjAlMjAlMjAlMjAlMjAlMjBicmVhayUzQiUwQSUyMCUyMCUyMCUyMGNhc2UlMjBMSUdIVF9CT1RIJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwZ3JlZW5MaWdodFZhbHVlJTIwJTNEJTIwMSUzQiUwQSUyMCUyMCUyMCUyMCUyMCUyMHJlZExpZ2h0VmFsdWUlMjAlM0QlMjAxJTNCJTBBJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslM0IlMEElMjAlMjAlMjAlMjBkZWZhdWx0JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyRVJST1IlM0ElMjBVbmtub3duJTIwbGlnaHRTZXR0aW5nJTNBJTIwJTI1ZCU1Q24lMjIlMkMlMjBsaWdodFNldHRpbmclMjklM0IlMEElMjAlMjAlN0QlMEElMEElMjAlMjAlMkYlMkYlMjBzZXQlMjBncmVlbiUyMGxpZ2h0JTIwdG8lMjBjb3JyZWN0JTIwc3RhdGUlMEElMjAlMjBzdGF0dXMlMjAlM0QlMjBrdklvUGluU2V0RGlnaXRhbCUyOEdSRUVOX0xJR0hUX1BJTiUyQyUyMGdyZWVuTGlnaHRWYWx1ZSUyOSUzQiUwQSUyMCUyMGlmJTIwJTI4c3RhdHVzJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyRVJST1IlM0ElMjBrdklvUGluU2V0RGlnaXRhbCUyMGZvciUyMHBpbiUyMCUyNWQlMjBmYWlsZWQlMjB3aXRoJTIwc3RhdHVzJTIwJTI1ZCU1Q24lMjIlMkMlMjBHUkVFTl9MSUdIVF9QSU4lMkMlMjBzdGF0dXMlMjklM0IlMEElMjAlMjAlN0QlMEElMEElMjAlMjAlMkYlMkYlMjBzZXQlMjByZWQlMjBsaWdodCUyMHRvJTIwY29ycmVjdCUyMHN0YXRlJTBBJTIwJTIwc3RhdHVzJTIwJTNEJTIwa3ZJb1BpblNldERpZ2l0YWwlMjhSRURfTElHSFRfUElOJTJDJTIwcmVkTGlnaHRWYWx1ZSUyOSUzQiUwQSUyMCUyMGlmJTIwJTI4c3RhdHVzJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyRVJST1IlM0ElMjBrdklvUGluU2V0RGlnaXRhbCUyMGZvciUyMHBpbiUyMCUyNWQlMjBmYWlsZWQlMjB3aXRoJTIwc3RhdHVzJTIwJTI1ZCU1Q24lMjIlMkMlMjBSRURfTElHSFRfUElOJTJDJTIwc3RhdHVzJTI5JTNCJTBBJTIwJTIwJTdEJTBBJTdE"][vc_column_text]

Listing 11: Function to set the green and red lights according to the input argument.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Sending CAN Status Message Periodically"][vc_column_text]
One of our requirements was to send a CAN status message peridoically. In our DBC file, we defined this CAN message as Event, containing the status of the gate and our two lights in the signals named GateStatus, GreenLight, and RedLight. Before sending or receiving any CAN messages, we need to set the bus parameters and go bus on, which we will do inside the on start hook.
[/vc_column_text][vc_code_raket language="trx" code="JTIwJTJGJTJGJTIwSW5pdGlhbGl6ZSUyMENBTiUyMGJ1cyUwQSUyMCUyMGNhblNldEJ1c1BhcmFtcyUyOGNhbkJJVFJBVEVfMU0lMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTI5JTNCJTBBJTIwJTIwY2FuQnVzT24lMjglMjklM0I="][vc_column_text]
We can now create a function that reads the current status of the gate and the two lights, as well as information about the test mode (more about that later). The function then uses the predefined type CanMessage_Status in order to send the information as specified in the DBC file.
[/vc_column_text][vc_code_raket language="trx" code="dm9pZCUyMHNlbmRTdGF0dXNNc2clMjglMjklMEElMkYlMkYlMjBTZW5kJTIwY3VycmVudCUyMHN0YXR1cyUyMG9mJTIwZ2F0ZSUyMGFuZCUyMGxpZ2h0cyUyMGluJTIwQ0FOJTIwbWVzc2FnZSUwQSU3QiUwQSUyMCUyMGludCUyMHN0YXR1cyUzQiUwQSUyMCUyMGludCUyMGdhdGVWYWx1ZSUzQiUwQSUyMCUyMGludCUyMGdyZWVuVmFsdWUlM0IlMEElMjAlMjBpbnQlMjByZWRWYWx1ZSUzQiUwQSUyMCUyMENhbk1lc3NhZ2VfU3RhdHVzJTIwY2FuU3RhdHVzTXNnJTNCJTIwJTIwJTJGJTJGJTIwJTIyU3RhdHVzJTIyJTIwaXMlMjBhJTIwTWVzc2FnZSUyMGRlZmluZWQlMjBpbiUyMG91ciUyMERCQyUyMGZpbGUlMEElMEElMjAlMjAlMkYlMkYlMjByZWFkJTIwdmFsdWUlMjBvZiUyMGdhdGUlMjBwaW4lMjB1c2luZyUyMGt2SW9QaW5HZXREaWdpdGFsJTBBJTIwJTIwc3RhdHVzJTIwJTNEJTIwa3ZJb1BpbkdldERpZ2l0YWwlMjhHQVRFX1BJTiUyQyUyMCUyNmdhdGVWYWx1ZSUyOSUzQiUwQSUyMCUyMGlmJTIwJTI4c3RhdHVzJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyRVJST1IlM0ElMjBrdklvUGluR2V0RGlnaXRhbCUyMGZvciUyMHBpbiUyMCUyNWQlMjBmYWlsZWQlMjB3aXRoJTIwc3RhdHVzJTIwJTI1ZCU1Q24lMjIlMkMlMjBHQVRFX1BJTiUyQyUyMHN0YXR1cyUyOSUzQiUwQSUyMCUyMCU3RCUwQSUwQSUyMCUyMCUyRiUyRiUyMHRoZSUyMGxpZ2h0JTIwcGlucyUyMGFyZSUyMERpZ2l0YWwlMjBPdXRwdXRzJTJDJTIwc28lMjB3ZSUyMG5lZWQlMjB0byUyMHVzZSUyMGt2SW9QaW5HZXRPdXRwdXREaWdpdGFsJTBBJTIwJTIwJTJGJTJGJTIwdG8lMjByZWFkJTIwdGhlJTIwbGF0ZXN0JTIwc2V0JTIwdmFsdWUlMEElMjAlMjBzdGF0dXMlMjAlM0QlMjBrdklvUGluR2V0T3V0cHV0RGlnaXRhbCUyOEdSRUVOX0xJR0hUX1BJTiUyQyUyMCUyNmdyZWVuVmFsdWUlMjklM0IlMEElMjAlMjBpZiUyMCUyOHN0YXR1cyUyOSUyMCU3QiUwQSUyMCUyMCUyMCUyMHByaW50ZiUyOCUyMkVSUk9SJTNBJTIwa3ZJb1BpbkdldERpZ2l0YWwlMjBmb3IlMjBwaW4lMjAlMjVkJTIwZmFpbGVkJTIwd2l0aCUyMHN0YXR1cyUyMCUyNWQlNUNuJTIyJTJDJTIwR1JFRU5fTElHSFRfUElOJTJDJTIwc3RhdHVzJTI5JTNCJTBBJTIwJTIwJTdEJTBBJTBBJTIwJTIwJTJGJTJGJTIwcmVhZCUyMGxhdGVzdCUyMHNldCUyMHZhbHVlJTIwZm9yJTIwcmVkJTIwbGlnaHQlMEElMjAlMjBzdGF0dXMlMjAlM0QlMjBrdklvUGluR2V0T3V0cHV0RGlnaXRhbCUyOFJFRF9MSUdIVF9QSU4lMkMlMjAlMjZyZWRWYWx1ZSUyOSUzQiUwQSUyMCUyMGlmJTIwJTI4c3RhdHVzJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyRVJST1IlM0ElMjBrdklvUGluR2V0RGlnaXRhbCUyMGZvciUyMHBpbiUyMCUyNWQlMjBmYWlsZWQlMjB3aXRoJTIwc3RhdHVzJTIwJTI1ZCU1Q24lMjIlMkMlMjBSRURfTElHSFRfUElOJTJDJTIwc3RhdHVzJTI5JTNCJTBBJTIwJTIwJTdEJTBBJTBBJTIwJTIwcHJpbnRmJTI4JTIyUGVyaW9kaWMlMjB2YWx1ZXMlMjB0ZXN0X2NvdW50ZXIlM0ElMjAlMjVkJTJDJTIwZ2F0ZSUzQSUyMCUyNWQlMkMlMjBncmVlbiUzQSUyMCUyNWQlMkMlMjByZWQlM0ElMjAlMjVkJTVDbiUyMiUyQyUyMHRlc3RNb2RlQ291bnRlciUyQyUyMGdhdGVWYWx1ZSUyQyUyMGdyZWVuVmFsdWUlMkMlMjByZWRWYWx1ZSUyOSUzQiUwQSUwQSUyMCUyMCUyRiUyRiUyMGZpbGwlMjBpbiUyMHRoZSUyMHJlYWQlMjB2YWx1ZXMlMjBpbiUyMHRoZSUyMGNvcnJlc3BvbmRpbmclMjBzaWduYWwlMkMlMjBhcyUyMGRlZmluZWQlMjBpbiUyMG91ciUwQSUyMCUyMCUyRiUyRiUyMERCQyUyMGZpbGUlMEElMjAlMjBjYW5TdGF0dXNNc2cuTW9kZUN5Y2xlcy5QaHlzJTIwJTNEJTIwdGVzdE1vZGVDb3VudGVyJTNCJTBBJTIwJTIwY2FuU3RhdHVzTXNnLkdhdGVTdGF0dXMuUGh5cyUyMCUzRCUyMGdhdGVWYWx1ZSUzQiUwQSUyMCUyMGNhblN0YXR1c01zZy5HcmVlbkxpZ2h0LlBoeXMlMjAlM0QlMjBncmVlblZhbHVlJTNCJTBBJTIwJTIwY2FuU3RhdHVzTXNnLlJlZExpZ2h0LlBoeXMlMjAlM0QlMjByZWRWYWx1ZSUzQiUwQSUwQSUyMCUyMCUyRiUyRiUyMHNlbmQlMjBDQU4lMjBtZXNzYWdlJTBBJTIwJTIwc3RhdHVzJTIwJTNEJTIwY2FuV3JpdGUlMjhjYW5TdGF0dXNNc2clMjklM0IlMEElMjAlMjBpZiUyMCUyOHN0YXR1cyUyOSUyMCU3QiUwQSUyMCUyMCUyMCUyMHByaW50ZiUyOCUyMkVSUk9SJTNBJTIwY2FuV3JpdGUlMjBpbiUyMHNlbmRTdGF0dXNNc2clMjBmYWlsZWQlMjB3aXRoJTIwc3RhdHVzJTIwJTI1ZCU1Q24lMjIlMkMlMjBzdGF0dXMlMjklM0IlMEElMjAlMjAlN0QlMEElN0Q="][vc_column_text]

Listing 12: Function to send current value of Digital Input and Digital Output as a CAN message using predefined signals in a DBC file.

[/vc_column_text][vc_column_text]
The CAN status message should be sent regularly, so we set up a timer, statusMessageTimer, to handle this. The initialization is done in the on start hook.
[/vc_column_text][vc_code_raket language="trx" code="JTIwJTIwJTJGJTJGJTIwaW5pdGlhbGl6ZSUyMHN0YXR1cyUyMG1lc3NhZ2UlMjB0aW1lciUwQSUyMCUyMHN0YXR1c01lc3NhZ2VUaW1lci50aW1lb3V0JTIwJTNEJTIwNTAwMCUzQiUyMCUyMCUyRiUyRiUyMHRpbWVyJTIwY3ljbGUlMjBpbiUyMG1zJTBBJTIwJTIwdGltZXJTdGFydCUyOHN0YXR1c01lc3NhZ2VUaW1lciUyQyUyMEZPUkVWRVIlMjklM0I="][vc_column_text]
The on Timer hook, which will trigger every 5 seconds, can now regularly send a CAN status message, see Listing 13.
[/vc_column_text][vc_code_raket language="trx" code="b24lMjBUaW1lciUyMHN0YXR1c01lc3NhZ2VUaW1lciUyMCU3QiUwQSUyMCUyMGludCUyMHN0YXR1cyUzQiUwQSUyMCUyMGludCUyMGdhdGVWYWx1ZSUzQiUwQSUwQSUyMCUyMHByaW50ZiUyOCUyMnN0YXR1c01lc3NhZ2VUaW1lciUyMHRyaWdnZXJlZCU1Q24lMjIlMjklM0IlMEElMEElMjAlMjAlMkYlMkYlMjBzZW5kJTIwc3RhdHVzJTIwbWVzc2FnZSUyMHdpdGglMjBjdXJyZW50JTIwdmFsdWVzJTBBJTIwJTIwc2VuZFN0YXR1c01zZyUyOCUyOSUzQiUwQSUwQSUyMCUyMCUyRiUyRiUyMG5vdyUyMHNldCUyMHRoZSUyMExFRCUyMGxpZ2h0cyUyMGFjY29yZGluZyUyMHRvJTIwdmFsdWUlMjBvZiUyMGdhdGUlMjBzZW5zb3IlMkMlMEElMjAlMjAlMkYlMkYlMjBqdXN0JTIwdG8lMjBiZSUyMG9uJTIwdGhlJTIwc2FmZSUyMHNpZGUlMEElMjAlMjBzZXRMaWdodEFjY29yZGluZ1RvR2F0ZVN0YXRlJTI4JTI5JTNCJTBBJTdE"][vc_column_text]

Listing 13: Timer handler to send CAN status messages regularly.

[/vc_column_text][vc_column_text]
The function to set the lights according to the state of the gate sensor is shown in Listing 14 (Please be patient, we will get to the testModeCounter shortly).
[/vc_column_text][vc_code_raket language="trx" code="dm9pZCUyMHNldExpZ2h0QWNjb3JkaW5nVG9HYXRlU3RhdGUlMjh2b2lkJTI5JTBBJTdCJTBBJTIwJTIwaW50JTIwc3RhdHVzJTNCJTBBJTIwJTIwaW50JTIwZ2F0ZVZhbHVlJTNCJTBBJTBBJTIwJTIwJTJGJTJGJTIwcmVhZCUyMHZhbHVlJTIwb2YlMjBnYXRlJTIwcGluJTBBJTIwJTIwc3RhdHVzJTIwJTNEJTIwa3ZJb1BpbkdldERpZ2l0YWwlMjhHQVRFX1BJTiUyQyUyMCUyNmdhdGVWYWx1ZSUyOSUzQiUwQSUyMCUyMGlmJTIwJTI4c3RhdHVzJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyRVJST1IlM0ElMjBrdklvUGluR2V0RGlnaXRhbCUyMGZvciUyMHBpbiUyMCUyNWQlMjBmYWlsZWQlMjB3aXRoJTIwc3RhdHVzJTIwJTI1ZCU1Q24lMjIlMkMlMjBHQVRFX1BJTiUyQyUyMHN0YXR1cyUyOSUzQiUwQSUyMCUyMCU3RCUwQSUwQSUyMCUyMGlmJTIwJTI4dGVzdE1vZGVDb3VudGVyJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyU3VwcHJlc3NlZCUyMGxlZCUyMGNoYW5nZSUyQyUyMHRlc3QlMjBtb2RlJTIwcnVubmluZyUyMCUyOHNldExpZ2h0JTNBJTI1ZCUyOSU1Q24lMjIlMkMlMjBnYXRlVmFsdWUlMjklM0IlMEElMjAlMjAlN0QlMjBlbHNlJTIwJTdCJTBBJTIwJTIwJTIwJTIwaWYlMjAlMjhnYXRlVmFsdWUlMjklMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjBzZXRMaWdodCUyOExJR0hUX1JFRCUyOSUzQiUwQSUyMCUyMCUyMCUyMCU3RCUyMGVsc2UlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjBzZXRMaWdodCUyOExJR0hUX0dSRUVOJTI5JTNCJTBBJTIwJTIwJTIwJTIwJTdEJTBBJTIwJTIwJTdEJTBBJTdE"][vc_column_text]

Listing 14: Reading state of gate and set lights accordingly.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Detecting Changes from the Gate Sensor"][vc_column_text]
There are two hooks available for detecting changes on a Digital Input pin, kvIO_EVENT_RISING_EDGE and kvIO_EVENT_FALLING_EDGE. When we detect a rising edge on the gate sensor, the gate has been opened and we should turn on the red light. (The testModeCounter will be explained later.)
[/vc_column_text][vc_code_raket language="trx" code="b24lMjBJb0V2ZW50JTIwJTNDR0FURV9QSU4lM0UlMjBrdklPX0VWRU5UX0ZBTExJTkdfRURHRSUyMCU3QiUwQSUyMCUyMGludCUyMHN0YXR1cyUzQiUwQSUyMCUyMENhbk1lc3NhZ2VfRXZlbnQlMjBjYW5FdmVudE1zZyUzQiUwQSUwQSUyMCUyMCUyRiUyRiUyMHRoZSUyMCUyMnRoaXMudmFsdWUlMjIlMjBjdXJyZW5seSUyMGFsd2F5cyUyMHJldHVybnMlMjBhJTIwZmxvYXQlMkMlMjBzbyUyMHdlJTIwbmVlZCUyMHRvJTIwY2FzdCUyMGhlcmUlMEElMjAlMjBwcmludGYlMjglMjJnYXRlJTIwc2Vuc29yJTIwJTI4cGluJTIwJTI1ZCUyOSUyMGZlbGwlMjB0byUyMCUyNWQlNUNuJTIyJTJDJTIwdGhpcy5waW4lMkMlMjAlMjhpbnQlMjl0aGlzLnZhbHVlJTI5JTNCJTBBJTIwJTIwaWYlMjAlMjh0ZXN0TW9kZUNvdW50ZXIlMjklMjAlN0IlMEElMjAlMjAlMjAlMjBwcmludGYlMjglMjJTdXBwcmVzc2VkJTIwc2V0dGluZyUyMGdyZWVuJTIwbGVkJTJDJTIwdGVzdCUyMG1vZGUlMjBydW5uaW5nLiU1Q24lMjIlMjklM0IlMEElMjAlMjAlMjAlMjBjYW5FdmVudE1zZy5Nb2RlLlBoeXMlMjAlM0QlMjAxJTNCJTBBJTIwJTIwJTdEJTIwZWxzZSUyMCU3QiUwQSUyMCUyMCUyMCUyMHNldExpZ2h0JTI4TElHSFRfR1JFRU4lMjklM0IlMEElMjAlMjAlMjAlMjBjYW5FdmVudE1zZy5Nb2RlLlBoeXMlMjAlM0QlMjAwJTNCJTBBJTIwJTIwJTdEJTBBJTIwJTIwY2FuRXZlbnRNc2cuR2F0ZUV2ZW50LlBoeXMlMjAlM0QlMjAlMjhpbnQlMjl0aGlzLnZhbHVlJTNCJTBBJTBBJTIwJTIwJTJGJTJGJTIwc2VuZCUyMENBTiUyMG1lc3NhZ2UlMEElMjAlMjBzdGF0dXMlMjAlM0QlMjBjYW5Xcml0ZSUyOGNhbkV2ZW50TXNnJTI5JTNCJTBBJTIwJTIwaWYlMjAlMjhzdGF0dXMlMjklMjAlN0IlMEElMjAlMjAlMjAlMjBwcmludGYlMjglMjJFUlJPUiUzQSUyMGNhbldyaXRlJTIwaW4lMjByaXNpbmclMjBldmVudCUyMGZhaWxlZCUyMHdpdGglMjBzdGF0dXMlMjAlMjVkJTVDbiUyMiUyQyUyMHN0YXR1cyUyOSUzQiUwQSUyMCUyMCU3RCUwQSU3RA=="][vc_column_text]

Listing 15: When a rising edge is detected on the gate sensor, turn on the red light and send CAN event message.

[/vc_column_text][vc_column_text]
Similarly, we should light up the green light and also send a CAN event message when a falling edge is detected on the gate sensor.
[/vc_column_text][vc_code_raket language="trx" code="b24lMjBJb0V2ZW50JTIwJTNDR0FURV9QSU4lM0UlMjBrdklPX0VWRU5UX1JJU0lOR19FREdFJTIwJTdCJTBBJTIwJTIwaW50JTIwc3RhdHVzJTNCJTBBJTIwJTIwQ2FuTWVzc2FnZV9FdmVudCUyMGNhbkV2ZW50TXNnJTNCJTBBJTBBJTIwJTIwJTJGJTJGJTIwdGhlJTIwJTIydGhpcy52YWx1ZSUyMiUyMGN1cnJlbmx5JTIwYWx3YXlzJTIwcmV0dXJucyUyMGElMjBmbG9hdCUyQyUyMHNvJTIwd2UlMjBuZWVkJTIwdG8lMjBjYXN0JTIwaGVyZSUwQSUyMCUyMHByaW50ZiUyOCUyMmdhdGUlMjBzZW5zb3IlMjAlMjhwaW4lMjAlMjVkJTI5JTIwcmlzZWQlMjB0byUyMCUyNWQlNUNuJTIyJTJDJTIwdGhpcy5waW4lMkMlMjAlMjhpbnQlMjl0aGlzLnZhbHVlJTI5JTNCJTBBJTIwJTIwaWYlMjAlMjh0ZXN0TW9kZUNvdW50ZXIlMjklMjAlN0IlMEElMjAlMjAlMjAlMjBwcmludGYlMjglMjJTdXBwcmVzc2VkJTIwc2V0dGluZyUyMHJlZCUyMGxlZCUyQyUyMHRlc3QlMjBtb2RlJTIwcnVubmluZy4lNUNuJTIyJTI5JTNCJTBBJTIwJTIwJTIwJTIwY2FuRXZlbnRNc2cuTW9kZS5QaHlzJTIwJTNEJTIwMSUzQiUwQSUyMCUyMCU3RCUyMGVsc2UlMjAlN0IlMEElMjAlMjAlMjAlMjBzZXRMaWdodCUyOExJR0hUX1JFRCUyOSUzQiUwQSUyMCUyMCUyMCUyMGNhbkV2ZW50TXNnLk1vZGUuUGh5cyUyMCUzRCUyMDAlM0IlMEElMjAlMjAlN0QlMEElMjAlMjBjYW5FdmVudE1zZy5HYXRlRXZlbnQuUGh5cyUyMCUzRCUyMCUyOGludCUyOXRoaXMudmFsdWUlM0IlMEElMEElMjAlMjAlMkYlMkYlMjBzZW5kJTIwQ0FOJTIwbWVzc2FnZSUwQSUyMCUyMHN0YXR1cyUyMCUzRCUyMGNhbldyaXRlJTI4Y2FuRXZlbnRNc2clMjklM0IlMEElMjAlMjBpZiUyMCUyOHN0YXR1cyUyOSUyMCU3QiUwQSUyMCUyMCUyMCUyMHByaW50ZiUyOCUyMkVSUk9SJTNBJTIwY2FuV3JpdGUlMjBpbiUyMGZhbGxpbmclMjBldmVudCUyMGZhaWxlZCUyMHdpdGglMjBzdGF0dXMlMjAlMjVkJTVDbiUyMiUyQyUyMHN0YXR1cyUyOSUzQiUwQSUyMCUyMCU3RCUwQSU3RA=="][vc_column_text]

Listing 16: When a falling edge is detected on the gate sensor, turn on the green light and send CAN event message.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="The Test Mode"][vc_column_text]
We have seen the testModeCounter appear earlier and it is finally time to explain the usage of this global variable. The central control unit should have the possibility to set our system into a test mode for a number of seconds as specified in the SetMode CAN message as we previously defined in our DBC file. During the test mode, the lights should alternate between red and green in fast succession. We start by adding an on CanMessage hook for the SetMode CAN message. If the Mode signal in the SetMode CAN message is one, we enter test mode, if the Mode signal is zero, we immediately exit test mode.
[/vc_column_text][vc_code_raket language="trx" code="b24lMjBDYW5NZXNzYWdlJTIwU2V0TW9kZSUyMCU3QiUwQSUyMCUyMHByaW50ZiUyOCUyMlNldE1vZGUlMjglMjVkJTJDJTIwJTI1ZCUyMGN5Y2xlcyUyOSUyMHJlY2VpdmVkJTVDbiUyMiUyQyUyMHRoaXMuTW9kZS5QaHlzJTJDJTIwdGhpcy5EdXJhdGlvbi5QaHlzJTI5JTNCJTBBJTIwJTIwaWYlMjAlMjh0aGlzLk1vZGUuUGh5cyUyOSUyMCU3QiUwQSUyMCUyMCUyMCUyMGVudGVyVGVzdE1vZGUlMjh0aGlzLkR1cmF0aW9uLlBoeXMlMjklM0IlMEElMjAlMjAlN0QlMjBlbHNlJTIwJTdCJTBBJTIwJTIwJTIwJTIwZXhpdFRlc3RNb2RlJTI4JTI5JTNCJTBBJTIwJTIwJTdEJTBBJTdE"][vc_column_text]

Listing 17: When a SetMode CAN message is received we start test mode

[/vc_column_text][vc_column_text]
When test mode is entered, we setup a timer to trigger when it’s time to switch the light from one color to the other. Since we switch the light every 250 ms, the number of timer cycles we should stay in test mode is the duration in seconds times four. Our global variable testModeCounter thus contains the number of cycles left before we should leave test mode, and if the value is zero, we are currently not in test mode.
[/vc_column_text][vc_code_raket language="trx" code="dm9pZCUyMGVudGVyVGVzdE1vZGUlMjhpbnQlMjBkdXJhdGlvbl9zJTI5JTBBJTJGJTJGJTIwRW50ZXIlMjB0ZXN0JTIwbW9kZSUyMGFuZCUyMHNjaGVkdWxlJTIwdG8lMjBleGl0JTIwYWZ0ZXIlMjBkdXJhdGlvbl9zJTIwc2Vjb25kcy4lMEElN0IlMEElMjAlMjBpbnQlMjBjeWNsZXMlM0IlMEElMEElMjAlMjB0ZXN0TW9kZVRpbWVyLnRpbWVvdXQlMjAlM0QlMjAyNTAlM0IlMjAlMjAlMkYlMkYlMjB0aW1lciUyMGN5Y2xlJTIwaW4lMjBtcyUwQSUyMCUyMGN5Y2xlcyUyMCUzRCUyMGR1cmF0aW9uX3MlMjAlMkElMjA0JTNCJTBBJTBBJTIwJTIwcHJpbnRmJTI4JTIyU3RhcnRpbmclMjBMRUQlMjB0ZXN0JTIwZm9yJTIwJTI1ZCUyMGN5Y2xlcyUyMCUyOCUyNWQlMjBzJTI5JTVDbiUyMiUyQyUyMGN5Y2xlcyUyQyUyMGR1cmF0aW9uX3MlMjklM0IlMEElMjAlMjB0ZXN0TW9kZUNvdW50ZXIlMjAlM0QlMjBjeWNsZXMlM0IlMEElMjAlMjB0aW1lclN0YXJ0JTI4dGVzdE1vZGVUaW1lciUyOSUzQiUwQSU3RA=="][vc_column_text]

Listing 18: Calculating the duration of the test mode, and setting the timer accordingly.

[/vc_column_text][vc_column_text]
When leaving the test mode, we reset the testModeCounter, in case we leave early, and set the lights according to the current state of the gate sensor.
[/vc_column_text][vc_code_raket language="trx" code="dm9pZCUyMGV4aXRUZXN0TW9kZSUyOCUyOSUwQSU3QiUwQSUyMCUyMHRlc3RNb2RlQ291bnRlciUyMCUzRCUyMDAlM0IlMEElMjAlMjB0aW1lckNhbmNlbCUyOHRlc3RNb2RlVGltZXIlMjklM0IlMEElMjAlMjBzZXRMaWdodEFjY29yZGluZ1RvR2F0ZVN0YXRlJTI4JTI5JTNCJTBBJTdE"][vc_column_text]

Listing 19: When a SetMode CAN message is received we start test mode

[/vc_column_text][vc_column_text]
The actual switching between green and red light is done in the on Timer hook of our testModeTimer. We also decrease the testModeCounter and exits test mode if the testModeCounter reaches zero.
[/vc_column_text][vc_code_raket language="trx" code="b24lMjBUaW1lciUyMHRlc3RNb2RlVGltZXIlMjAlN0IlMEElMjAlMjB0ZXN0TW9kZUNvdW50ZXItLSUzQiUwQSUyMCUyMHByaW50ZiUyOCUyMnRlc3RNb2RlVGltZXIlMjB0cmlnZ2VyZWQlMjAlMjglMjVkJTI5JTIyJTJDJTIwdGVzdE1vZGVDb3VudGVyJTI5JTNCJTBBJTBBJTIwJTIwaWYlMjAlMjh0ZXN0TW9kZUNvdW50ZXIlMjAlM0UlMjAwJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwaWYlMjAlMjh0ZXN0TW9kZUNvdW50ZXIlMjAlMjUlMjAyJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwc2V0TGlnaHQlMjhMSUdIVF9HUkVFTiUyOSUzQiUwQSUyMCUyMCUyMCUyMCU3RCUyMGVsc2UlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjBzZXRMaWdodCUyOExJR0hUX1JFRCUyOSUzQiUwQSUyMCUyMCUyMCUyMCU3RCUwQSUyMCUyMCUyMCUyMHRpbWVyU3RhcnQlMjh0ZXN0TW9kZVRpbWVyJTI5JTNCJTBBJTIwJTIwJTdEJTIwZWxzZSUyMCU3QiUwQSUyMCUyMCUyMCUyMHRpbWVyQ2FuY2VsJTI4dGVzdE1vZGVUaW1lciUyOSUzQiUwQSUyMCUyMCU3RCUwQSU3RA=="][vc_column_text]

Listing 20: A timer hook takes care of switching the lights and decreasing the test mode counter.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Clean up"][vc_column_text]
All we have to do now in our t program is to do some clean up in the on stop section.
[/vc_column_text][vc_code_raket language="trx" code="b24lMjBzdG9wJTIwJTdCJTBBJTIwJTIwdGltZXJDYW5jZWwlMjhzdGF0dXNNZXNzYWdlVGltZXIlMjklM0IlMEElMjAlMjB0aW1lckNhbmNlbCUyOHRlc3RNb2RlVGltZXIlMjklM0IlMEElMjAlMjBzZXRMaWdodCUyOExJR0hUX09GRiUyOSUzQiUyMCUyMCUyMCUyMCUyRiUyRiUyMEZXJTIwdjMuMTclMjBpcyUyMG5lZWRlZCUyMGZvciUyMHRoaXMlMEElMjAlMjBwcmludGYlMjglMjJzdGF0dXNfdGltZXJfZGJjLnQlMjBzdG9wcGVkJTVDbiUyMiUyOSUzQiUwQSUwQSUyMCUyMGNhbkJ1c09mZiUyOCUyOSUzQiUwQSU3RA=="][vc_column_text]

Listing 21: Cleaning up in the “on stop” section.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Conclusion"][vc_column_text]
In this rather lengthy article we have seen how to handle some key parts in the way we write t programs for the Kvaser DIN Rail: • Confirming a configuration • Controlling Digital Outputs • Acting when a Digital Input changes • Sending CAN messages • Trigger actions on incoming CAN messages Hopefully you can use these parts in order to create your own custom t program, solving your unique problem. If you have any questions or comments, please send them to [email protected].
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Footnotes"][vc_column_text]1The reason for having a high value indicating an open gate is that if the cable to the sensor is cut, we will get a high value, and it will still be interpreted as the hazardous state, i.e. the same as an open gate. 2The document The Kvaser t Programming language is available for download from https://www.kvaser.com/download/[/vc_column_text][/vc_column][/vc_row] [post_title] => A Fictional Use Case With Kvaser DIN Rail and t programming [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => a-fictional-use-case-with-kvaser-din-rail-and-t-programming [to_ping] => [pinged] => [post_modified] => 2021-10-06 17:05:30 [post_modified_gmt] => 2021-10-06 17:05:30 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?post_type=developer_blog&p=27372 [menu_order] => 0 [post_type] => developer_blog [post_mime_type] => [comment_count] => 0 [filter] => raw ) [7] => WP_Post Object ( [ID] => 27270 [post_author] => 23 [post_date] => 2020-02-08 02:13:16 [post_date_gmt] => 2020-02-08 02:13:16 [post_content] => [vc_row][vc_column][vc_single_image image="27285"][vc_column_text]Sensor ECS was founded in 2006 as a specialized distributor for industrial/embedded PC products, focusing on OEM customers within all vertical markets in Scandinavia. The company first became involved in CAN through customers in the forest machinery sector, however it was the requirements of a medical OEM that prompted Sensor ECS to become a Kvaser customer. Ted Mattsson, managing director of Sensor ECS, explains:[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text css=".vc_custom_1581127533391{margin-right: 20px !important;margin-left: 20px !important;}"]“We depended upon an Asian IPC manufacturer for CAN products with 1 or 2 ports, but the software support wasn’t always good enough. Now we have replaced the CAN module with a Kvaser solution, which provides the additional benefit of local support when needed, plus best in class products and software.”[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Offering competitive pricing and added value through simple customizations, flexible sourcing and total package procurement, Mattsson sees plenty of opportunities for Sensor ECS. Among them, further growth for CAN in the heavy vehicle industry, which, with its reputation for quality products delivered reliably and quickly, Sensor ECS will be in a good position to take advantage of.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Contact Sensor ECS:

[/vc_column_text][vc_raket_associate post_id="26369"][/vc_column][/vc_row] [post_title] => Sensor ECS counts on Kvaser for reliable CAN solutions [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => sensor-ecs-counts-on-kvaser-for-reliable-can-solutions [to_ping] => [pinged] => [post_modified] => 2020-03-23 10:10:46 [post_modified_gmt] => 2020-03-23 10:10:46 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=27270 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [8] => WP_Post Object ( [ID] => 27265 [post_author] => 23 [post_date] => 2020-02-08 01:58:05 [post_date_gmt] => 2020-02-08 01:58:05 [post_content] => [vc_row][vc_column][vc_single_image image="27266"][vc_column_text]
[/vc_column_text][/vc_column][/vc_row] [post_title] => Kvaser is CHARMed again [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => kvaser-is-charmed-again [to_ping] => [pinged] => [post_modified] => 2020-02-08 01:58:05 [post_modified_gmt] => 2020-02-08 01:58:05 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=27265 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [9] => WP_Post Object ( [ID] => 27166 [post_author] => 5 [post_date] => 2020-01-29 02:56:46 [post_date_gmt] => 2020-01-29 02:56:46 [post_content] => [vc_row][vc_column][vc_single_image image="27167"][vc_column_text]Hosted by Kvaser qualified sales representative Opsoc Inc., Kvaser and technical associates, RA Consulting and Warwick Control Technologies, recently took part in Automotive World Japan. According to Derek Sum, General Manager of Kvaser Hong Kong, the exhibition was ‘one of the best Japanese shows I have participated in for some years’. With the goal of showing customers that Kvaser is not just a hardware provider, but also a one stop solution for CAN analyzers, diagnostic tools, OBD emission testing and data acquisition, visitors were able to see Kvaser’s latest interface and datalogger hardware working with Warwick Control’s X Analyzer 3 with scope feature and RA Consulting’s diagnostic and OBD products, including the latest update of their DiagRA X data acquisition tools, which features a new user interface. Opsoc’s stand was particularly well attended this year, partly thanks to the position at the entrance of the exhibition hall, but also because of high visitor numbers on the second and third days.[/vc_column_text][/vc_column][/vc_row] [post_title] => Japanese show highlights ‘total solution’ value of Kvaser’s partner network [post_excerpt] => [post_status] => publish [comment_status] => open [ping_status] => open [post_password] => [post_name] => japanese-show-highlights-total-solution-value-of-kvasers-partner-network [to_ping] => [pinged] => [post_modified] => 2020-01-29 02:56:46 [post_modified_gmt] => 2020-01-29 02:56:46 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=27166 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) ) [post_count] => 10 [current_post] => -1 [in_the_loop] => [post] => WP_Post Object ( [ID] => 27720 [post_author] => 6080 [post_date] => 2020-04-03 08:49:13 [post_date_gmt] => 2020-04-03 08:49:13 [post_content] => [post_title] => Importance of Calibrating for High Precision Measurement [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => importance-of-calibrating-for-high-precision-measurement [to_ping] => [pinged] => [post_modified] => 2022-04-04 10:19:11 [post_modified_gmt] => 2022-04-04 10:19:11 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=27720 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [comment_count] => 0 [current_comment] => -1 [found_posts] => 469 [max_num_pages] => 47 [max_num_comment_pages] => 0 [is_single] => [is_preview] => [is_page] => [is_archive] => [is_date] => [is_year] => [is_month] => [is_day] => [is_time] => [is_author] => [is_category] => [is_tag] => [is_tax] => [is_search] => [is_feed] => [is_comment_feed] => [is_trackback] => [is_home] => 1 [is_privacy_policy] => [is_404] => [is_embed] => [is_paged] => 1 [is_admin] => [is_attachment] => [is_singular] => [is_robots] => [is_favicon] => [is_posts_page] => 1 [is_post_type_archive] => [query_vars_hash:WP_Query:private] => 2e8c494091227cd5032feac51d6bdfea [query_vars_changed:WP_Query:private] => 1 [thumbnails_cached] => [stopwords:WP_Query:private] => [compat_fields:WP_Query:private] => Array ( [0] => query_vars_hash [1] => query_vars_changed ) [compat_methods:WP_Query:private] => Array ( [0] => init_query_flags [1] => parse_tax_query ) )

News and Events

Importance of Calibrating for High Precision Measurement

03/04/2020

Read More

Read More

Free Micro CANopen libraries for NXP MCUs.

03/04/2020

Read More

Read More

Warwick Releases Enhanced NMEA 2000® & SAE J1939 Features in X-Analyser

27/03/2020

Warwick Control is pleased to announce the latest release of the powerful tool X-Analyser.  In particular this release has enhanced… Read More

Read More
Kvaser’s March 2020 Software Release

Kvaser’s March 2020 Software Release

25/03/2020

Kvaser’s latest software release supports .NET standard and adds further J2534 capabilities Notable changes and additions include: Python canlib package… Read More

Read More
Using CANlib Visual Studio 2019 C# .NET STANDARD 2.0

Using CANlib Visual Studio 2019 C# .NET STANDARD 2.0

19/03/2020

The Kvaser C# wrapper for CANlib has been ported to .NET Standard. In this document, I will show you how… Read More

Read More
CAN XL: Bridging the bitrate gap between CAN FD and Ethernet

CAN XL: Bridging the bitrate gap between CAN FD and Ethernet

27/02/2020

CAN XL is a new standard that is in development by CAN in Automation (CiA), the not-for-profit association that maintains… Read More

Read More
A Fictional Use Case With Kvaser DIN Rail and <em>t</em> programming

A Fictional Use Case With Kvaser DIN Rail and t programming

25/02/2020

In order to create a fictional use case, let us assume that the company we are working for are installing… Read More

Read More

Sensor ECS counts on Kvaser for reliable CAN solutions

08/02/2020

Sensor ECS was founded in 2006 as a specialized distributor for industrial/embedded PC products, focusing on OEM customers within all… Read More

Read More
Kvaser is CHARMed again

Kvaser is CHARMed again

08/02/2020

Kvaser participated again this year in the Chalmers Student Union’s career fair, known as CHARM, an annual event that matches… Read More

Read More
Japanese show highlights ‘total solution’ value of Kvaser’s partner network

Japanese show highlights ‘total solution’ value of Kvaser’s partner network

29/01/2020

Hosted by Kvaser qualified sales representative Opsoc Inc., Kvaser and technical associates, RA Consulting and Warwick Control Technologies, recently took… Read More

Read More