WP_Query Object
(
[query] => Array
(
[paged] => 39
[pagename] => about-us/news
)
[query_vars] => Array
(
[paged] => 39
[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 380, 10
[posts] => Array
(
[0] => WP_Post Object
(
[ID] => 8035
[post_author] => 6
[post_date] => 2015-05-28 12:36:56
[post_date_gmt] => 2015-05-28 12:36:56
[post_content] => [vc_row][vc_column][vc_column_text]Kvaser is participating in several CAN FD Tech Days in the Europe in 2015. Come along to hear about the latest CAN FD developments, answer your CAN FD questions, exchange views and network with CAN FD experts.
The events are as follows:[/vc_column_text][vc_column_text]CAN FD Tech Day Stuttgart – 30th June 2015
Kent Lennartson delivered a presentation on how to integrate CAN FD into a classical CAN architecture. Download the presentation PDF here.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]CAN FD Tech Day Prague – 24th September 2015
Venue: Hotel Alwyn, Vitkova 26/151, 18600 Prague 8 - Karlin
Of special interest: CANopen FD. Presentations on this next generation data link layer and its impacts on system design and higher-layer protocols are part of this event.
CAN FD Tech Day Göteborg – 10th December 2015
Venue: TBD
Of special interest: Presentations on this next generation data link layer and its impacts on system design and higher-layer protocols are part of this event. It serves as a platform for technical discussions and networking. At the accompanying tabletop exhibition, CAN-related products and services are displayed.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_separator_raket][vc_column_text]At each of the above events, Kvaser’s hardware manager, Kent Lennartsson, will present a paper entitled ‘CAN-FD FILTER FOR CLASSICAL CAN DEVICES AND PHYSICAL LAYER DIAGNOSTICS’. Use the form above to download it in advance.
You’ll also be able to see Kvaser’s CAN FD demonstrator in the tabletop exhibit. For more information and to register for any of the above events, please visit www.can-cia.org.
For more information on CAN FD in general, click here.[/vc_column_text][/vc_column][/vc_row]
[post_title] => Kvaser Presenting at CiA's CAN FD Tech Days Europe
[post_excerpt] => Come along to hear about the latest CAN FD developments, answer your CAN FD questions, exchange views and network with CAN FD experts.
Download the CAN FD presentation.
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => kvaser-presenting-at-cias-can-fd-tech-days-europe
[to_ping] =>
[pinged] =>
[post_modified] => 2022-09-29 04:14:13
[post_modified_gmt] => 2022-09-29 04:14:13
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?p=8035
[menu_order] => 0
[post_type] => post
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[1] => WP_Post Object
(
[ID] => 7640
[post_author] => 5
[post_date] => 2015-05-26 06:52:11
[post_date_gmt] => 2015-05-26 06:52:11
[post_content] => Until recently, petrol was the standard choice for most pleasure boat powerplants. More compact, lighter and more powerful than their traditional diesel counterparts, petrol engines were the ideal choice for small pleasure and light commercial applications where limited operating hour requirements and tighter cost constraints have traditionally driven powertrain selection.
“In most commercial situations, however, diesel technology is recognised as superior – more fuel efficient and robust, but heavy, complex and expensive,” explains Christer Flodman, technical manager for Cimco Marine Diesel AB. “But a new generation of stronger, lighter and even more fuel efficient diesel engines has tipped the balance and is making diesel an option for the outboard engine in smaller marine applications.”
Cimco Marine Diesel has recently launched the world’s first high performance, high efficiency marine outboard diesel engine, called the OXE. The innovative gearbox belt design – originally developed for stern drives and inboard engine technology - eliminates the need for conventional complex bevel gears and transfer shafts to efficiently transfer the drive of a common-rail diesel engine. For this project Cimco has marinized a standard GM 2.0-litre turbo diesel engine by designing separate systems for seawater, heat exchangers, intercooler and oil cooler as well as mounting the entire powerplant horizontally. All service points are at the front of the engine, so maintenance and servicing can be performed on the water, whilst the addition of a dry sump system maintains consistent oil lubrication in all running conditions, allowing for rolling in heavy seas, plus tilting and trimming situations.
Whilst diesel outboard engines for light marine applications aren’t new, they aren’t commonplace either and they have historically been large and low power – the most popular being just 37bhp. The OXE is the world’s first 200bhp production diesel outboard motor, and a number of engine sizes are in development – both smaller and larger than 200bhp.
Throughout the project Cimco Marine AB has relied on a tool chain supplied by Kvaser technical associate, Accurate Technologies (ATI) Sweden AB. ATI supplied products used by CIMCO on the OXE program include ATI VISION ECU calibration and data acquisition software, CSM data acquisition hardware, and Kvaser USBcan Pro and Memorator Pro interfaces and data loggers for CAN analysis.
The modular suite of hardware and software was used throughout the evaluation program. Marine engines undergo similar test procedures as those in the automotive industry. Dyno tests simulate different climatic conditions, plus cold start, emissions and numerous sea trials. Kvaser CAN interfaces were used in static test rigs such as those to optimise drivetrain losses and hydraulic pressure testing, as well as on all sea trials in test cells.
Notes Flodman: “All the products worked excellently together. Minimal feedback and support were required from ATI as the software, DAQ modules and Kvaser’s CAN interfaces and dataloggers were all extremely easy to set up. I had used these products before but the rest of the team hadn’t. They were impressed. They provided us with a strong and efficient toolchain that let us focus on the product development, rather than spending valuable time solving test equipment issues.”
Cimco Marine Diesel AB was set up in 2012 to bring the OXE to commercial reality. However, development of the OXE technology has taken over six years, with component test – belt system, engine, gearbox, electrical system, fuel system and air intake etc. – over a period of three years to allow for rigorous sea trials. “What took the time,” recounts Flodman, “was packaging the system into a small, light form factor that would meeting the running conditions of commercial craft, which are much tougher than the pleasure market.”
Potential applications vary enormously and include coastguard patrol where intermediate loads are required for many hours; transportation between fish farms, where long distances are involved and the engine may idle for long periods; and military applications where a maximum load is required in harsh environmental conditions, because the user’s life depends upon the product. Whilst the OXE has not been designed to meet military specifications, the armed forces’ single fuel policy objective means that many military applications would benefit greatly from a small diesel engine alternative.
[post_title] => Kvaser data loggers used to develop first ever 200bhp diesel outboard motor
[post_excerpt] => Cimco Marine Diesel has recently launched the world’s first high performance, high efficiency marine outboard diesel engine - the OXE. Find out more about how it was developed, using a tool chain supplied by Kvaser technical associate, Accurate Technologies Sweden AB.
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => kvaser-dataloggers-used-to-develop-first-ever-200bhp-diesel-outboard-motor
[to_ping] =>
[pinged] =>
[post_modified] => 2022-09-29 04:14:13
[post_modified_gmt] => 2022-09-29 04:14:13
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?p=7640
[menu_order] => 0
[post_type] => post
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[2] => WP_Post Object
(
[ID] => 5661
[post_author] => 5
[post_date] => 2015-05-09 17:53:49
[post_date_gmt] => 2015-05-09 17:53:49
[post_content] => [vc_row][vc_column][vc_single_image image="5662" img_size="full"][vc_column_text]New to Kvaser’s interface portfolio is the Kvaser USBcan Light 2xHS, a USB to dual channel Controller Area Network (CAN) interface. With a USB 2.0 compliant connector at one end and two 9-pin D-SUB connectors at the other, USBcan Light 2xHS is a compact, reliable and cost-effective means of connecting two high speed CAN busses to a PC or mobile computer in applications as wide ranging as automotive, mining, marine, military, oil and gas exploration, military, industrial and heavy machinery.
A fraction larger than the one-channel Leaf Light v2, the Kvaser USBcan Light 2xHS features the sleek, ergonomically designed housing that Kvaser products are renowned for and comes with galvanic isolation as standard.
Kvaser USBcan Light 2xHS is supplied with CANlib, the software API that is common to all Kvaser hardware. Taking just 30 seconds to programme once you have Canlib downloaded on the host computer, USBcan Light 2xHS is simple to install and configure.
For more information on the Kvaser USBcan Light 2xHS interface, please click through to: www.kvaser.com/product/USBcanLight2xHS[/vc_column_text][/vc_column][/vc_row]
[post_title] => Double your CAN capabilities with the USBcan Light 2xHS
[post_excerpt] => the Kvaser USBcan Light 2xHS, a USB to dual channel Controller Area Network (CAN) interface. With a USB 2.0 compliant connector at one end and two 9-pin D-SUB connectors at the other, USBcan Light 2xHS is a compact, reliable and cost-effective means of connecting two high speed CAN busses to a PC or mobile computer.
[post_status] => publish
[comment_status] => open
[ping_status] => open
[post_password] =>
[post_name] => dual-can-to-usb-interface
[to_ping] =>
[pinged] =>
[post_modified] => 2022-09-29 04:14:13
[post_modified_gmt] => 2022-09-29 04:14:13
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?p=5661
[menu_order] => 0
[post_type] => post
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[3] => WP_Post Object
(
[ID] => 39875
[post_author] => 14
[post_date] => 2015-05-06 13:33:20
[post_date_gmt] => 2015-05-06 13:33:20
[post_content] => [vc_row][vc_column][vc_column_text]When interacting with CANlib, many functions need a handle to a channel. This channel is often referred to as the "CANlib Channel" because this is how it is labeled in Kvaser Hardware.[/vc_column_text][vc_single_image image="7404" img_size="large"][vc_column_text]If we want to send CAN messages from the first channel on the Eagle device, we should open CANlib channel three canopenChannel(3, canOPEN_EXCLUSIVE)
. Some functions in CANlib are independent of the actual channel on the device and therefore you could use any device channel with equal success. For example, to turn the device LEDs on or off you call kvFlashLeds(hnd, kvLED_ACTION_ALL_LEDS_ON)
where hnd
could be a handle for CANlib channel three or four. So why the need for a Card Number? Well, historically, all interaction with Kvaser devices that did not go through the Kvaser CANlib was directed to the driver directly. In this case the CANlib channel number could not be used an thus a new number was needed to indicate e.g. "the second device" using the driver kcany
. This new number was called the "Card Number" and is shown in Kvaser Hardware when a device channel is selected.[/vc_column_text][vc_single_image image="7405" img_size="large"][vc_column_text]In the figure above, we can see that the Kvaser Memorator Pro 5xHS, which is a five channel device, is connected to CANlib channel six and Card Number two. Both the CANlib channel and Card Number is starting from zero (as programmers usually do), but through some random act of fate, the Card Number is presented in Kvaser Hardware (and in Kvaser Hardware only) as if it was started from one. So our device is actually connected to CANlib channel six but Card Number one which means that we need to issue the command hydra_flash.exe -C1 imagefile.img
in order to upgrade the firmware of this device. Nowadays, this is little more than a historical anecdote since we get the zero indexed Card Number by calling CANlib (canGetChannelData(channel, canCHANNELDATA_CARD_NUMBER, buffer, bufsize)
). This is also how the Python module kvDevice does it in order to assist you when interfacing other libraries (such as kvmlib) that uses the Card Number. Still, it is fun to know how stuff works...[/vc_column_text][vc_column_text]
[/vc_column_text][/vc_column][/vc_row]
[post_title] => Was that the CANlib channel number or Card Number?
[post_excerpt] =>
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => canlib-channel-number-card-number
[to_ping] =>
[pinged] =>
[post_modified] => 2022-10-04 13:35:18
[post_modified_gmt] => 2022-10-04 13:35:18
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?post_type=developer_blog&p=39875
[menu_order] => 0
[post_type] => developer_blog
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[4] => WP_Post Object
(
[ID] => 39879
[post_author] => 14
[post_date] => 2015-05-05 13:42:54
[post_date_gmt] => 2015-05-05 13:42:54
[post_content] => [vc_row][vc_column][vc_column_text]As engineers, we often like to see a piece of hardware work straight out of the box. This gives us that warm fuzzy feeling that we are starting development on a stable platform. We also like to prove that a unit is behaving properly when a previously working system starts acting odd. In both these cases, a simple loopback test to verify the hardware is still able to transmit and receive messages is a good place to start.
On a CAN HS (High Speed) network, you cannot just send a write command or receive command to the CAN interface. CAN requires the network to have at least two active nodes for successful communication. Otherwise, when the node transmits a message, the node does not receive an ACK frame. This will cause the node to generate an ERROR frame and then retransmit the message. This process will continue until the node reaches an Error Passive state.
CAN HS also requires that these nodes be connected on a properly terminated bus. This means 120 Ohm terminating resistor between CAN_H and CAN_L at the furthest points of the network backbone. This yields a measured resistance between CAN_H and CAN_L of 60 Ohms. If the bus is not properly terminated, reflection issues may arise interfering with transmission – especially at higher bit rates.
The Kvaser T-cannector v2 provides a quick CAN bus with proper termination so you do not need to create any special cables to test the Kvaser unit straight out of the box. When diagnosing an existing system, the Kvaser T-cannector v2 removes any of the system’s cabling from the test path in case this cabling has developed shorts or a terminator has failed.
To drive the test, Kvaser CanKing will transmit and receive the messages on the CAN bus. This prevents the need to create software before using the Kvaser unit. This also removes the system software application as a possible problem source when testing the hardware.[/vc_column_text][vc_separator_raket][vc_column_text]To perform the loopback test, you will need the following:
- Kvaser Drivers for Windows installed (Download)
- Kvaser CANKing installed (Download)
- A Kvaser T-cannector v2 (View product)
- Two Kvaser HS channels. These channels can be on a single device like an USBcan Light 2xHS or you can have two Leaf Light v2 units attached to the same PC.
The following steps will walk you through the loopback test:
- Connect the Kvaser unit(s) to the PC.
- Connect the Kvaser unit’s male CAN connectors to the Kvaser T-cannector’s female CAN connectors. You will need at least two physical channels connected.
- Set the Kvaser T-cannector’s terminator setting to 60 Ohms.
- On the PC, launch the Kvaser CanKing application. Press the OK button on the Create a New Project Using Dialog with the Template radio button lit.
- In the Templates dialog, choose the CAN Kingdom (2 channels) template and press the OK button. CanKing will now be displaying five windows: CanKing menu bar, CAN 1, CAN 2, Select Formatters, and the Output window.
- The CAN 1 and CAN 2 windows show the channel associated with the window on the Bus Statistics tab in the Bus Parameters group. If the channels shown do not match the channels you attached to the Kvaser T-cannector, press the Bus Parameters tab for the CAN window. Use the CAN Channel drop down list to select the appropriate channel and press the Apply button. Then press the Bus Statistics tab.
- Once you have both CAN windows set to the appropriate channel, press the CanKing Menu bar Play button. This will bring both channels bus on.
- In the CanKing Menu bar, select the Messages -> Universal -> Universal menu item. This will open up the CAN Message window.
- Enter the desired CAN identifier, a data length code (DLC), and the byte data values. A ‘$’ in front of the number means you are enter the value in hexadecimal instead of decimal. A ‘x’ after the identifier value means you wish to send a 29 bit identifier instead of an 11 bit identifier.
- Press the CAN Message window Send button to transmit a message on the bus. You should see the message appear in the Output window twice – once where the message was transmitted on CAN 1 and once where the message was received on CAN 2.
You have now completed a simple loopback test. Some additional things you can do are:
- Use the CAN Message Channel drop down list to choose which channel performs the transmission. This way you can test transmitting and receiving of both channels.
- Use the CanKing Menu bar Messages -> Universal -> Traffic generator menu item to open the Traffic generator window. This window allows you to stress the channels but putting out bursts of messages or continuous random messages.
- Use the Bus Parameters tab of the CAN windows to change the bit rate used. By default, the channels will be set to 250 kbits/s. You can move the bit rate up or down to match the bit rate used in your system. Don’t forget to press the Stop button before changing bit rates. And make sure you change the bit rate settings for both channels before going back on bus. The channels will not communicate if you have them set to two different bit rates and plugged into the same CAN bus.
[/vc_column_text][vc_column_text]
[/vc_column_text][/vc_column][/vc_row]
[post_title] => Easy Loopback Testing with the Kvaser T-cannector v2 and CanKing
[post_excerpt] =>
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => easy-loopback-testing-kvaser-t-cannector-v2-canking
[to_ping] =>
[pinged] =>
[post_modified] => 2022-10-04 13:44:42
[post_modified_gmt] => 2022-10-04 13:44:42
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?post_type=developer_blog&p=39879
[menu_order] => 0
[post_type] => developer_blog
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[5] => WP_Post Object
(
[ID] => 39877
[post_author] => 14
[post_date] => 2015-04-29 13:38:30
[post_date_gmt] => 2015-04-29 13:38:30
[post_content] => [vc_row disable_element="yes"][vc_column][vc_column_text]
This is the first part of a series.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/2"][vc_column_text]The new Kvaser Pro products have script feature called t. The t language is a 'c like', event oriented language. The t-programs run on the device and can be loaded and started either from a pc or autonomously on the device. This is a short introduction to get started with t programming.[/vc_column_text][vc_column_text]To be able to test and run a t program you need a Kvaser Pro product. The software needed is installed with CANlib SDK and called Kvaser TRX.[/vc_column_text][/vc_column][vc_column width="1/2"][vc_column_text]
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]To get up and running and write your first t program, start by downloading and installing CANlib SDK (Download) then start TRX.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]It will look something like this:
In the <New> tab enter:[/vc_column_text][vc_code_raket code="b24lMjBzdGFydCUyMCU3QiUwQSUyMCUyMHByaW50ZiUyOCUyMkhlbGxvJTIwV29ybGQlMjElNUNuJTIyJTI5JTNCJTBBJTdE"][vc_column_text]This a very basic program that reacts on an 'on start' event and prints "Hello World!" in the 'Device Output'. It is the actual device that sends the "Hello World!" to the computer and that TRX reads.
Then choose Run->Compile from the menu. To be able to compile you first have to save the t program, TRX will prompt you for this, and it will also prompt you to save a project file. I saved it as blogpost1.
If the compilation succedes the next step will require an actual Kvaser Pro product.
I connected a Kvaser Memorator Pro 2xHS v2 (View Product). You can see that TRX can use your device if the combo box just under the menu bar has the name of your Kvaser device.
To test the t program, just go to Run->Download, this will download the t program to the device. Next step will be to actually run the program. Run->Run will start he application, thus hopefully you will see the printf printout in the Device Output window.
[/vc_column_text][vc_column_text][/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]
Additional resources:
- The description of the t language can be found in the The Kvaser t Programming Language specification (View).
[/vc_column_text][vc_column_text]
[/vc_column_text][/vc_column][/vc_row]
[post_title] => Getting Started with t Programming
[post_excerpt] =>
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => getting-started-with-t-programming
[to_ping] =>
[pinged] =>
[post_modified] => 2022-10-04 13:40:17
[post_modified_gmt] => 2022-10-04 13:40:17
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?post_type=developer_blog&p=39877
[menu_order] => 0
[post_type] => developer_blog
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[6] => WP_Post Object
(
[ID] => 39876
[post_author] => 14
[post_date] => 2015-04-22 13:35:29
[post_date_gmt] => 2015-04-22 13:35:29
[post_content] => [vc_row][vc_column][vc_column_text]Some of our interfaces are equipped with hardware buffers for automatic sending or responding to messages. They can be used when the timing conditions are strict, and might not be possible to fulfill on the application level.
Normally, a CAN message received by the CAN driver in the Kvaser unit has to pass through to the computer, by for example a USB or PCI port. It has to pass the operating system and get picked up by the driver before the application can process it. Now, this isn’t as slow as it sounds, but sometimes it is not fast enough. That is when the Kvaser object buffers can be useful, to get around the latency caused by these steps.
There are two types of object buffers,
auto response and
auto transmit.
- Auto response sends a defined message immediately upon receiving a message meeting your conditions.
- Auto transmit sends a message periodically, with higher timing accuracy than can be achieved by an application working through driver and operating system.
[/vc_column_text][vc_column_text]
Using the object buffers
Scenario 1: Auto Response
To use the object buffers, you start with allocating a buffer with a call to
canObjBufAllocate().
For an auto response buffer, you define which messages to respond to by calling
canObjBufSetFilter(), and the contents of the response is set with
canObjBufWrite().
To enable a buffer, call
canObjBufEnable(), and call
canObjBufDisable() to disable it.
The filter in
canObjBufSetFilter() is of mask and code type, which means you can set the buffer to respond to a range of CAN ids.
Example Code:
This code snippet sets up a buffer that responds to CAN ID 100, with a message with ID 200.[/vc_column_text][vc_code_raket language="csharp" header="This code snippet sets up a buffer that responds to CAN ID 100, with a message with ID 200" code="JTIwJTJGJTJBJTIwU2V0JTIwdXAlMjBhbiUyMGF1dG8lMjByZXNwb25zZSUyMGJ1ZmZlciUyMCUyQSUyRiUwQSUwQSUwQWJ5dGUlNUIlNUQlMjBtc2clMjAlM0QlMjAlN0IlMjAxJTJDJTIwMiUyQyUyMDMlMkMlMjA0JTJDJTIwNSUyQyUyMDYlMjAlN0QlM0IlMjAlMkYlMkZkZWZpbmUlMjBtZXNzYWdlJTBBaW50JTIwYXV0b0J1ZkluZGV4JTIwJTNEJTIwJTI4aW50JTI5JTI4Y2FuT2JqQnVmQWxsb2NhdGUlMjhoYW5kbGUlMkMlMjBjYW5PQkpCVUZfVFlQRV9BVVRPX1JFU1BPTlNFJTI5JTI5JTNCJTIwJTJGJTJGQWxsb2NhdGUlMjBidWZmZXIlMEFpbnQlMjBzdGF0dXMlM0IlMEFzdGF0dXMlMjAlM0QlMjBjYW5PYmpCdWZXcml0ZSUyOGhhbmRsZSUyQyUyMGF1dG9CdWZJbmRleCUyQyUyMDIwMCUyQyUyMG1zZyUyQyUyMDAlMkMlMjAwJTI5JTNCJTIwJTJGJTJGV3JpdGUlMjB0byUyMGJ1ZmZlciUwQXN0YXR1cyUzRCUyMCUyMGNhbk9iakJ1ZlNldEZpbHRlciUyOGhhbmRsZSUyQyUyMGF1dG9CdWZJbmRleCUyQyUyMDEwMCUyQyUyMDB4RkZGRiUyOSUzQiUyMCUyRiUyRk9ubHklMjBtYXRjaCUyMG1lc3NhZ2UlMjB3aXRoJTIwaWQlMjAxMDAlMkMlMjBtYXRjaCUyMG9uJTIwYWxsJTIwYml0cy4lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMEFzdGF0dXMlMjAlM0QlMjBjYW5saWJDTFNORVQuQ2FubGliLmNhbk9iakJ1ZkVuYWJsZSUyOGhhbmRsZSUyQyUyMGF1dG9CdWZJbmRleCUyOSUzQiUyMCUyRiUyRmFjdGl2YXRlJTIwdGhlJTIwYnVmZmVyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw"][vc_column_text][/vc_column_text][vc_column_text]
Scenario 2: Auto Transmit
Once again, to use the object buffers, you start with allocating a buffer with a call to
canObjBufAllocate().
For an auto transmit buffer, call
canObjBufSetPeriod() to set the frequency of the message, call
canObjBufSetMsgCount() to set the number of messages to send from the buffer, and call
canObjBufWrite() to define the contents of the message.
Example Code:
This code snippet set up a auto transmit buffer that sends a message with ID 300 with an interval of 1ms.[/vc_column_text][vc_code_raket language="csharp" code="JTJGJTJBJTIwU2V0JTIwdXAlMjBhbiUyMGF1dG8lMjB0cmFuc21pdCUyMGJ1ZmZlciUyMCUyQSUyRiUwQSUwQWJ5dGUlNUIlNUQlMjBtc2clMjAlM0QlMjAlN0IlMjAxJTJDJTIwMiUyQyUyMDMlMkMlMjA0JTJDJTIwNSUyQyUyMDYlMjAlN0QlM0IlMjAlMkYlMkZkZWZpbmUlMjBtZXNzYWdlJTBBaW50JTIwYXV0b0J1ZkluZGV4JTIwJTNEJTIwJTI4aW50JTI5JTI4Y2FuT2JqQnVmQWxsb2NhdGUlMjhoYW5kbGUlMkMlMjBjYW5PQkpCVUZfVFlQRV9BVVRPX1RSQU5TTUlUJTI5JTI5JTNCJTIwJTJGJTJGQWxsb2NhdGUlMjBidWZmZXIlMEFpbnQlMjBzdGF0dXMlM0IlMEFzdGF0dXMlMjAlM0QlMjBjYW5PYmpCdWZXcml0ZSUyOGhhbmRsZSUyQyUyMGF1dG9CdWZJbmRleCUyQyUyMDMwMCUyQyUyMG1zZyUyQyUyMDAlMkMlMjAwJTI5JTNCJTIwJTJGJTJGV3JpdGUlMjB0byUyMGJ1ZmZlciUwQXN0YXR1cyUyMCUzRCUyMGNhbk9iakJ1ZlNldFBlcmlvZCUyOGhhbmRsZSUyQyUyMGF1dG9CdWZJbmRleCUyQyUyMDEwMDAlMjklM0IlMjAlMkYlMkZTZXQlMjBwZXJpb2QlMjB0byUyMDEwMDAlMjBtaWNyb3NlY29uZHMlMEFzdGF0dXMlMjAlM0QlMjBjYW5saWJDTFNORVQuQ2FubGliLmNhbk9iakJ1ZkVuYWJsZSUyOGhhbmRsZSUyQyUyMGF1dG9CdWZJbmRleCUyOSUzQiUyMCUyRiUyRmFjdGl2YXRlJTIwdGhlJTIwYnVmZmVyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw"][vc_column_text][/vc_column_text][vc_column_text]
Which CAN interfaces has Object Buffers?
Hardware object buffers are available on our Professional products, and in general 8 buffers are available.
Search Professional products >>[/vc_column_text][vc_column_text]
[/vc_column_text][/vc_column][/vc_row]
[post_title] => Using Object Buffers
[post_excerpt] =>
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => using-object-buffers
[to_ping] =>
[pinged] =>
[post_modified] => 2022-10-04 13:37:57
[post_modified_gmt] => 2022-10-04 13:37:57
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?post_type=developer_blog&p=39876
[menu_order] => 0
[post_type] => developer_blog
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[7] => WP_Post Object
(
[ID] => 39846
[post_author] => 14
[post_date] => 2015-04-14 09:26:20
[post_date_gmt] => 2015-04-14 09:26:20
[post_content] => [vc_row][vc_column][vc_message]This blog uses now deprecated functions, see blog "
Improved API in Python canlib v1.5" for more information.[/vc_message][vc_column_text]
This is the last post in a 3-part series about using Python with Kvaser products:
- Accessing Kvaser CANlib from Python
- Using Python to connect to your remote device
- A more object oriented approach on accessing your Kvaser device from Python
Earlier we have seen how to use the canlib.py and kvrlib.py wrappers in Python (currently for v2.7). However, those are primarily just "wrappers" and do not take into account the flexibility we get with an object oriented language as Python (this is equally true for other wrappers like C#).
During testing, the focus is often on a specific device instead of the channel centered CANlib. This is especially true when you are dealing with remote devices such as Kvaser BlackBird v2 and Ethercan that tend to turn up on new CANlib channels when connected remotely. This is now taken care of via the new Python module kvDevice.
To open a specific device, supply the EAN and serial number as shown below.[/vc_column_text][vc_code_raket language="python" header="Accessing a device using kvDevice.py." code="aW1wb3J0JTIwb3MlMEFpbXBvcnQlMjBzeXMlMEFzeXMucGF0aC5hcHBlbmQlMjglMjJDJTNBJTJGdGVtcCUyRkNhbmxpYl9TREtfdjUuOSUyRlNhbXBsZXMlMkZQeXRob24lMjIlMjklMEElMEFpbXBvcnQlMjBrdkRldmljZSUwQSUwQWRldmljZSUyMCUzRCUyMGt2RGV2aWNlLmt2RGV2aWNlJTI4ZWFuJTNEJTIyNzMtMzAxMzAtMDA3NzgtOSUyMiUyQyUyMHNlcmlhbCUzRDEwMjMlMjklMEFwcmludCUyMCUyMiU1Q24lMjIlMkMlMjBkZXZpY2UlMEE="][vc_column_text]If we have a device with EAN and serial number that matches we get the following output:[/vc_column_text][vc_code_raket language="clike" code="RGV2aWNlJTNBJTIwS3Zhc2VyJTIwTWVtb3JhdG9yJTIwUHJvJTIwNXhIUyUyMCUyOGNoYW5uZWwlMjAwJTI5JTBBRUFOJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwNzMtMzAxMzAtMDA3NzgtOSUwQVMlMkZOJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwMTAyMyUwQUZXJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwdjIuNS4yODclMEFDYXJkJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwMSUwQURydiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMGtjYW55MWElMEFDYW5saWIlMjBjaGFubmVsJTNBJTIwMw=="][vc_column_text]If we do not specify the serial number, we get the first device that matches the EAN. It is also possible to specify a CANlib channel directly.[/vc_column_text][vc_code_raket language="python" header="Accessing a device using only EAN or CANlib channel." code="ZGV2aWNlJTIwJTNEJTIwa3ZEZXZpY2Uua3ZEZXZpY2UlMjhlYW4lM0QlMjI3My0zMDEzMC0wMDc3OC05JTIyJTI5JTBBcHJpbnQlMjAlMjIlNUNuJTIyJTJDJTIwZGV2aWNlJTBBJTBBZGV2aWNlJTIwJTNEJTIwa3ZEZXZpY2Uua3ZEZXZpY2UlMjhjaCUzRDYlMjklMEFwcmludCUyMCUyMiU1Q24lMjIlMkMlMjBkZXZpY2U="][vc_code_raket language="clike" code="RGV2aWNlJTNBJTIwS3Zhc2VyJTIwTWVtb3JhdG9yJTIwUHJvJTIwNXhIUyUyMCUyOGNoYW5uZWwlMjAwJTI5JTBBRUFOJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwNzMtMzAxMzAtMDA3NzgtOSUwQVMlMkZOJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwMTAyMyUwQUZXJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwdjIuNS4yODclMEFDYXJkJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwMSUwQURydiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMGtjYW55MWElMEFDYW5saWIlMjBjaGFubmVsJTNBJTIwMiUwQSUwQURldmljZSUzQSUyMEt2YXNlciUyME1lbW9yYXRvciUyMFBybyUyMDV4SFMlMjAlMjhjaGFubmVsJTIwNCUyOSUwQUVBTiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMDczLTMwMTMwLTAwNzc4LTklMEFTJTJGTiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMDEwMjMlMEFGVyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMHYyLjUuMjg3JTBBQ2FyZCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMDElMEFEcnYlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0ElMjBrY2FueTFlJTBBQ2FubGliJTIwY2hhbm5lbCUzQSUyMDYlMEE="][vc_column_text]As a final example, if the specified device is not found, we still get a device returned but we do not get any information about it.[/vc_column_text][vc_code_raket language="python" header="Example of accessing a device using kvDevice.py." code="ZGV2aWNlcyUyMCUzRCUyMGt2RGV2aWNlLmt2RGV2aWNlLmFsbERldmljZXMlMjglMjklMEFwcmludCUyMCUyMkxpc3QlMjBhbGwlMjAlMjVkJTIwZGV2aWNlcyUyMiUyMCUyNSUyMCUyOGxlbiUyOGRldmljZXMlMjklMjklMEFmb3IlMjBkZXYlMjBpbiUyMGRldmljZXMlM0ElMEFwcmludCUyMCUyMiU1Q24lMjIlMkMlMjBkZXYlMEElMEFwcmludCUyMCUyMiU1Q24tLS0lNUNuVHJ5JTIwYW5kJTIwZmluZCUyMGElMjBub24tZXhpc3RpbmclMjBkZXZpY2UuJTIyJTBBZGV2aWNlJTIwJTNEJTIwa3ZEZXZpY2Uua3ZEZXZpY2UlMjhlYW4lM0QlMjI3My0zMDEzMC0wMDc3OC05JTIyJTJDJTIwc2VyaWFsJTNEMTAwJTI5JTBBcHJpbnQlMjAlMjIlNUNuJTIyJTJDJTIwZGV2aWNl"][vc_code_raket language="clike" code="TGlzdCUyMGFsbCUyMDIlMjBkZXZpY2VzJTBBJTBBRGV2aWNlJTNBJTIwS3Zhc2VyJTIwRWFnbGUlMjAlMjhjaGFubmVsJTIwMCUyOSUwQUVBTiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMDczLTMwMTMwLTAwNTY3LTklMEFTJTJGTiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMDcxJTBBRlclMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0ElMjB2Mi41LjI2MSUwQUNhcmQlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0ElMjAwJTBBRHJ2JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwa2NhbnkwYSUwQUNhbmxpYiUyMGNoYW5uZWwlM0ElMjAwJTBBJTBBRGV2aWNlJTNBJTIwS3Zhc2VyJTIwTWVtb3JhdG9yJTIwUHJvJTIwNXhIUyUyMCUyOGNoYW5uZWwlMjAwJTI5JTBBRUFOJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwNzMtMzAxMzAtMDA3NzgtOSUwQVMlMkZOJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwMTAyMyUwQUZXJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwdjIuNS4yODclMEFDYXJkJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwMSUwQURydiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMGtjYW55MWElMEFDYW5saWIlMjBjaGFubmVsJTNBJTIwMiUwQS0tLSUwQVRyeSUyMGFuZCUyMGZpbmQlMjBhJTIwbm9uLWV4aXN0aW5nJTIwZGV2aWNlLiUwQSUwQURldmljZSUzQSUyME5vbmUlMEFFQU4lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0ElMjA3My0zMDEzMC0wMDc3OC05JTBBUyUyRk4lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0ElMjAxMDAlMEFGVyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyME5vbmUlMEFDYXJkJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNBJTIwTm9uZSUwQURydiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyME5vbmUlMEFDYW5saWIlMjBjaGFubmVsJTNBJTIwTm9uZSUwQQ=="][vc_column_text]If you take a look inside the module
kvDevice.py
, you'll notice that most of the attributes are stored in names starting with an underscore (
_driver
,
_channel
and so on). This tries to denote that these values are the
last known values. (In Python, a leading underscore is normally a weak "internal use" indicator.) That is, the device could now have been removed and perhaps also reinserted and thus got renumbered, but the last time the device was opened via
kvDevice.py
, it was found using those values. (The device was found on CANlib channel
_channel
using the driver name
_driver
.)
Hopefully, this overview of how Python can be used to help manage Kvaser devices will help you to be even more productive in your role as a developer.
EDIT 2015-05-22: Stated that the current wrappers are written for Python v2.7.[/vc_column_text][vc_column_text]
[/vc_column_text][/vc_column][/vc_row]
[post_title] => A more object oriented approach on accessing your Kvaser device from Python (3 of 3)
[post_excerpt] =>
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => object-oriented-approach-accessing-kvaser-device-python-3-3
[to_ping] =>
[pinged] =>
[post_modified] => 2022-11-18 22:54:20
[post_modified_gmt] => 2022-11-18 22:54:20
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?post_type=developer_blog&p=39846
[menu_order] => 0
[post_type] => developer_blog
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[8] => WP_Post Object
(
[ID] => 39878
[post_author] => 14
[post_date] => 2015-04-08 13:40:42
[post_date_gmt] => 2015-04-08 13:40:42
[post_content] => [vc_row][vc_column][vc_message]This blog uses now deprecated functions, see blog "
Improved API in Python canlib v1.5" for more information.[/vc_message][vc_column_text]
This is the second post in a 3-part series about using Python with Kvaser products:
- Accessing Kvaser CANlib from Python
- Using Python to connect to your remote device
- A more object oriented approach on accessing your Kvaser device from Python
[/vc_column_text][vc_column_text]Last time I mentioned that kvrlib also has a Python v2.7 wrapper included in the Kvaser CANlib SDK and I thought we could take a quick look at this as well. The kvrlib library is used to handle remote devices, such as the Blackbird and Ethercan devices. We will try some discovery and configuration in the following two examples.
First let us use the discovery functions to scan and connect to a remote device. Our remote device has serial number 16 and is already connected to the same network as our computer:[/vc_column_text][vc_code_raket language="python" header="Example of using the Python kvrlib wrapper for scanning." code="aW1wb3J0JTIwc3lzJTBBc3lzLnBhdGguYXBwZW5kJTI4JTIyQyUzQSUyRnRlbXAlMkZDYW5saWJfU0RLX3Y1LjklMkZTYW1wbGVzJTJGUHl0aG9uJTIyJTI5JTBBJTBBaW1wb3J0JTIwa3ZybGliJTBBJTBBa2wlMjAlM0QlMjBrdnJsaWIua3ZybGliJTI4JTI5JTBBcHJpbnQlMjAlMjJrdnJsaWIlMjB2ZXJzaW9uJTNBJTIwJTI1cyUyMiUyMCUyNSUyMGtsLmdldFZlcnNpb24lMjglMjklMEElMEFzZXJpYWxObyUyMCUzRCUyMDE2JTBBcHJpbnQlMjAlMjJDb25uZWN0aW5nJTIwdG8lMjBkZXZpY2UlMjB3aXRoJTIwc2VyaWFsJTIwbnVtYmVyJTIwJTI1cyUyMiUyMCUyNSUyMHNlcmlhbE5vJTBBYWRkcmVzc0xpc3QlMjAlM0QlMjBrdnJsaWIua3ZyRGlzY292ZXJ5LmdldERlZmF1bHRBZGRyZXNzZXMlMjhrdnJsaWIua3ZyQWRkcmVzc1R5cGVGbGFnX0JST0FEQ0FTVCUyOSUwQXByaW50JTIwJTIyRm91bmQlMjAlMjVkJTIwYWRkcmVzc2VzLiUyMiUyMCUyNSUyMGFkZHJlc3NMaXN0LmNvdW50JTBBJTIzcHJpbnQlMjBhZGRyZXNzTGlzdCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQWRpc2NvdmVyeSUyMCUzRCUyMGtsLmRpc2NvdmVyeU9wZW4lMjglMjklMEFkaXNjb3Zlcnkuc2V0QWRkcmVzc2VzJTI4YWRkcmVzc0xpc3QlMjklMEElMEFkZWxheV9tcyUyMCUzRCUyMDEwMCUwQXRpbWVvdXRfbXMlMjAlM0QlMjAxMDAwJTBBZGlzY292ZXJ5LnNldFNjYW5UaW1lJTI4ZGVsYXlfbXMlMkMlMjB0aW1lb3V0X21zJTI5JTBBcHJpbnQlMjAlMjJTY2FubmluZyUyMGRldmljZXMuLi4lNUNuJTIyJTBBZGV2aWNlSW5mb3MlMjAlM0QlMjBkaXNjb3ZlcnkuZ2V0UmVzdWx0cyUyOCUyOSUwQSUyM3ByaW50JTIwJTIyU2Nhbm5pbmclMjByZXN1bHQlM0ElNUNuJTI1cyUyMiUyMCUyNSUyMGRldmljZUluZm9zJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBZm9yJTIwZGV2aWNlSW5mbyUyMGluJTIwZGV2aWNlSW5mb3MlM0ElMEElMjAlMjAlMjAlMjBpZiUyMGRldmljZUluZm8uc2VyX25vJTIwJTNEJTNEJTIwc2VyaWFsTm8lM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZXZpY2VJbmZvLmNvbm5lY3QlMjglMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyMCUyN0Nvbm5lY3RpbmclMjB0byUyMHRoZSUyMGZvbGxvd2luZyUyMGRldmljZSUzQSUyNyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50JTIwJTI3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJTI3JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjBkZXZpY2VJbmZvJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGlzY292ZXJ5LnN0b3JlRGV2aWNlcyUyOGRldmljZUluZm9zJTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslM0IlMEFkaXNjb3ZlcnkuY2xvc2UlMjglMjklMEFrbC51bmxvYWQlMjglMjk="][vc_column_text]You should really set the envar PYTHONPATH before calling your script instead of appending to the
sys.path
(as seen on line 2). Note also that the Python wrappers are usually quite helpful when printing resulting variables. This means that you could uncomment line 13 and line 22 and get a human readable output.
The above code gives the following output:[/vc_column_text][vc_code_raket language="clike" code="a3ZybGliJTIwdmVyc2lvbiUzQSUyMDguOSUwQUNvbm5lY3RpbmclMjB0byUyMGRldmljZSUyMHdpdGglMjBzZXJpYWwlMjBudW1iZXIlMjAxNiUwQUZvdW5kJTIwNCUyMGFkZHJlc3Nlcy4lMEFTY2FubmluZyUyMGRldmljZXMuLi4lMEElMEFDb25uZWN0aW5nJTIwdG8lMjB0aGUlMjBmb2xsb3dpbmclMjBkZXZpY2UlM0ElMEEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0lMEFuYW1lJTJGaG9zdG5hbWUlMjAlMjAlM0ElMjAlMjJLdmFzZXIlMjBSZW1vdGUlMjAlMjMxNiUyMiUyMCUyRiUyMCUyMmt2LTA3MTMwLTAwMDAxNiUyMiUwQSUyMCUyMGVhbiUyRnNlcmlhbCUyMCUyMCUyMCUzQSUyMDczMzAxLTMwMDA3MTMwJTIwJTJGJTIwMTYlMEElMjAlMjBmdyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQSUyMDIuNC4xMjYlMEElMjAlMjBhZGRyJTJGY2xpJTJGQVAlMjAlMjAlM0ElMjAxMC4wLjMuMzIlMjAlMjhJUFY0JTI5JTIwJTJGJTIwMTAuMC4zLjI3JTIwJTI4SVBWNCUyOSUyMCUyRiUyMHVua25vd24lMjAlMjhVTktOT1dOJTI5JTBBJTIwJTIwdXNhZ2UlMkZhY2Nlc3MlMjAlM0ElMjBGUkVFJTIwJTJGJTIwUFVCTElDJTBBJTIwJTIwcGFzcyUyRmVuYy5rZXklMjAlM0ElMjBubyUyMCUyRiUyMG5v"][vc_column_text]Now let us do some minimal configuration on the device, why not change the device name? The remote device has now turned up on CANlib channel 0 (line 6), let us set the device name to "MrKvaser" (line 7).[/vc_column_text][vc_code_raket language="python" header="Example of setting device name on a remote device." code="aW1wb3J0JTIwc3lzJTBBc3lzLnBhdGguYXBwZW5kJTI4JTIyQyUzQSUyRnRlbXAlMkZDYW5saWJfU0RLX3Y1LjklMkZTYW1wbGVzJTJGUHl0aG9uJTIyJTI5JTBBJTBBaW1wb3J0JTIwa3ZybGliJTBBJTBBY2FuQ2hhbm5lbCUyMCUzRCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMEFkZXZpY2VOYW1lJTIwJTNEJTIwJTIyTXJLdmFzZXIlMjIlMjAlMjAlMjAlMEElMEFrbCUyMCUzRCUyMGt2cmxpYi5rdnJsaWIlMjglMjklMEFwcmludCUyMCUyMkNvbmZpZ3VyYXRpbmclMjBkZXZpY2UlMjBvbiUyMGNoYW5uZWwlMjAlMjVkLiUyMiUyMCUyNSUyMGNhbkNoYW5uZWwlMEF0cnklM0ElMEElMjAlMjAlMjAlMjBjb25maWclMjAlM0QlMjBrbC5jb25maWdPcGVuJTI4Y2hhbm5lbCUzRGNhbkNoYW5uZWwlMkMlMjBtb2RlJTNEa3ZybGliLmt2ckNvbmZpZy5NT0RFX1JXJTI5JTIwJTBBJTIwJTIwJTIwJTIwY29uZmlnLmdldFhtbCUyOCUyOSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMHByaW50JTIwJTIyQ3VycmVudCUyMGRldmljZSUyMGNvbmZpZ3VyYXRpb24lM0ElNUNuJTI1cyUyMiUyMCUyNSUyMGNvbmZpZy54bWwudG94bWwlMjglMjklMjAlMEElMjAlMjAlMjAlMjBwcmludCUyMCUyMkRldmljZSUyMG5hbWUlMjB3YXMlMjAlMjclMjVzJTI3JTIyJTIwJTI1JTIwY29uZmlnLnhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSUyOCUyN05FVFdPUkslMjclMjklNUIwJTVELmF0dHJpYnV0ZXMlNUIlMjdkZXZpY2VfbmFtZSUyNyU1RC52YWx1ZSUwQSUyMCUyMCUyMCUyMHByaW50JTIwJTIyU2V0dGluZyUyMG5ldyUyMGRldmljZSUyMG5hbWUlMjAlMjclMjVzJTI3JTIyJTIwJTI1JTIwZGV2aWNlTmFtZSUwQSUyMCUyMCUyMCUyMGNvbmZpZy54bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUlMjglMjdORVRXT1JLJTI3JTI5JTVCMCU1RC5hdHRyaWJ1dGVzJTVCJTI3ZGV2aWNlX25hbWUlMjclNUQudmFsdWUlMjAlM0QlMjBkZXZpY2VOYW1lJTIwJTBBJTIwJTIwJTIwJTIwY29uZmlnLnNldFhtbCUyOCUyOSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMGNvbmZpZy5jbG9zZSUyOCUyOSUwQWV4Y2VwdCUyMCUyOGt2cmxpYi5rdnJFcnJvciUyOSUyMGFzJTIwZXglM0ElMEElMjAlMjAlMjAlMjBwcmludCUyMGV4JTBBJTBBa2wudW5sb2FkJTI4JTI5"][vc_column_text]We start by opening the configuration in read/write mode on line 12, then reads in the existing configuration on line 13. After printing the whole XML configuration on line 14 we manipulate the device name element before writing it back to the device on line 18.
This results in the following being printed on the console:[/vc_column_text][vc_code_raket language="clike" code="Q29uZmlndXJhdGluZyUyMGRldmljZSUyMG9uJTIwY2hhbm5lbCUyMDAuJTBBQ3VycmVudCUyMGRldmljZSUyMGNvbmZpZ3VyYXRpb24lM0ElMEElM0MlM0Z4bWwlMjB2ZXJzaW9uJTNEJTIyMS4wJTIyJTIwJTNGJTNFJTNDS1ZBU0VSJTNFJTBBJTNDVkVSU0lPTiUzRTQuMyUzQyUyRlZFUlNJT04lM0UlMEElM0NQUk9EVUNURkFNSUxZJTNFZXRoZXJjYW4lM0MlMkZQUk9EVUNURkFNSUxZJTNFJTBBJTNDREVWSUNFX0FDQ0VTUyUyMGxldmVsJTNEJTIyUFVCTElDJTIyJTIwcGFzc3dvcmQlM0QlMjIlMjIlMkYlM0UlMEElM0NDT05GSUdfUFJPVEVDVElPTiUyMHBhc3N3b3JkJTNEJTIyJTIyJTIwcHJvdGVjdGVkJTNEJTIyTk8lMjIlMkYlM0UlMEElM0NORVRXT1JLJTIwYWRkcmVzc190eXBlJTNEJTIyREhDUCUyMiUyMGRldmljZV9uYW1lJTNEJTIyS3Zhc2VyJTIwUmVtb3RlJTIwJTIzMTYlMjIlMjBob3N0X25hbWUlM0QlMjJrdi0wNzEzMC0wMDAwMTYlMjIlMjBtdHUlM0QlMjIxNDkyJTIyJTIwcG9ydCUzRCUyMjExNDE2JTIyJTJGJTNFJTBBJTNDUFJPRklMRV9JTkZPJTIwbmFtZSUzRCUyMlVubmFtZWQlMjBQcm9maWxlJTIyJTJGJTNFJTBBJTNDVFJBRkZJQ19FTkNSWVBUSU9OJTIwa2V5JTNEJTIyJTIyJTIwdHlwZSUzRCUyMk5PTkUlMjIlMkYlM0UlMEElM0NXRUJTRVJWRVIlMjBjaGFuZ2VfbG9nX3NldHRpbmdzJTNEJTIyTk8lMjIlMjBkZWJ1Z19jb21tYW5kcyUzRCUyMk5PJTIyJTIwZW5hYmxlZCUzRCUyMk5PJTIyJTIwdXNlcl9kYXRhX2Rvd25sb2FkJTNEJTIyTk8lMjIlMkYlM0UlMEElM0MlMkZLVkFTRVIlM0UlMEFEZXZpY2UlMjBuYW1lJTIwd2FzJTIwJTI3S3Zhc2VyJTIwUmVtb3RlJTIwJTIzMTYlMjclMEFTZXR0aW5nJTIwbmV3JTIwZGV2aWNlJTIwbmFtZSUyMCUyN01yS3Zhc2VyJTI3"][vc_column_text]The XML configuration that we get from the device can be manipulated using built-in Python XML support as can be seen on line 14 and line 17.
You can find the full description of the XML used during configuration in the document
Specification of Kvaser Remote Device Configuration XML Format on the
download page.
Just one more thing, do we really need to "know" that the device will turn up on CANlib channel 0 (at line 6)? Let us fix that in the next post...
EDIT 2015-05-22: Stated that the current wrappers are written for Python v2.7.[/vc_column_text][vc_column_text]
[/vc_column_text][/vc_column][/vc_row]
[post_title] => Using Python to connect to your remote device (2 of 3)
[post_excerpt] =>
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => using-python-connect-remote-device-2-3
[to_ping] =>
[pinged] =>
[post_modified] => 2022-11-18 22:57:17
[post_modified_gmt] => 2022-11-18 22:57:17
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?post_type=developer_blog&p=39878
[menu_order] => 0
[post_type] => developer_blog
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[9] => WP_Post Object
(
[ID] => 39843
[post_author] => 14
[post_date] => 2015-04-01 08:51:16
[post_date_gmt] => 2015-04-01 08:51:16
[post_content] => [vc_row][vc_column][vc_message]This blog uses now deprecated functions, see blog "
Improved API in Python canlib v1.5" for more information.[/vc_message][vc_column_text css=".vc_custom_1432272939969{padding-top: 10px !important;padding-bottom: 5px !important;padding-left: 10px !important;background-color: #f4f4f4 !important;}"]
This is the first post in a 3-part series about using Python with Kvaser products:
- Accessing Kvaser CANlib from Python
- Using Python to connect to your remote device
- A more object oriented approach on accessing your Kvaser device from Python
[/vc_column_text][vc_column_text]Did you know that you can access Kvaser CANlib from Python? There have been Python wrappers for CANlib included in the Kvaser CANlib SDK for a while now, but recently they have gotten an overhaul and more libraries and functions are wrapped as we speak. Currently the wrappers is only tested in Python v2.7 and is not compatible with Python v3.
The latest released version of SDK can be found on
www.kvaser.com/download/ (Current version is
v 5.9 (released 2015-03-17). Be sure to install the SDK to a place where you have write permissions if you plan to edit the samples directly. (The default
C:\Program Files (x86)\Kvaser\Canlib\ is usually not the ideal place. As you can see below, today I chose a sub-directory of
C:\temp\.)
The downloaded Python sample directory now includes wrappers for both CANlib and kvrlib. To get an idea of how to use them, see the bottom of each wrapper file. E.g. the
canlib.py can be used as seen below.[/vc_column_text][vc_code_raket language="python" header="Example of using the Python CANlib wrapper." code="aW1wb3J0JTIwc3lzJTBBc3lzLnBhdGguYXBwZW5kJTI4JTIyQyUzQSUyRnRlbXAlMkZDYW5saWJfU0RLX3Y1LjklMkZTYW1wbGVzJTJGUHl0aG9uJTIyJTI5JTBBJTBBaW1wb3J0JTIwY2FubGliJTBBJTBBY2wlMjAlM0QlMjBjYW5saWIuY2FubGliJTI4JTI5JTBBcHJpbnQlMjAlMjJjYW5saWIlMjB2ZXJzaW9uJTNBJTIwJTI1cyUyMiUyMCUyNSUyMGNsLmdldFZlcnNpb24lMjglMjklMEElMEFjaGFubmVsJTIwJTNEJTIwMCUwQWhhbmRsZTElMjAlM0QlMjBjbC5vcGVuQ2hhbm5lbCUyOGNoYW5uZWwlMkMlMjBjYW5saWIuY2FuT1BFTl9BQ0NFUFRfVklSVFVBTCUyOSUwQXByaW50JTIwJTIyVXNpbmclMjBjaGFubmVsJTNBJTIwJTI1cyUyQyUyMEVBTiUzQSUyMCUyNXMlMjIlMjAlMjUlMjAlMjhoYW5kbGUxLmdldENoYW5uZWxEYXRhX05hbWUlMjglMjklMkMlMEFoYW5kbGUxLmdldENoYW5uZWxEYXRhX0VBTiUyOCUyOSUyOSUwQSUwQWhhbmRsZTEuc2V0QnVzT3V0cHV0Q29udHJvbCUyOGNhbmxpYi5jYW5EUklWRVJfTk9STUFMJTI5JTBBaGFuZGxlMS5zZXRCdXNQYXJhbXMlMjhjYW5saWIuY2FuQklUUkFURV8xTSUyOSUwQWhhbmRsZTEuYnVzT24lMjglMjk="][vc_column_text]Running the above code results in the following printout.
canlib version: 8.9
Using channel: Kvaser Ethercan Light HS (Remote) (channel 0), EAN: 73-30130-00713-0
[/vc_column_text][vc_column_text]As veteran users of CANlib knows, the version number of canlib.dll that is printed (8.9), is not identical to the version number of the CANlib package (v5.9).
Appending of the variable
sys.path
(as seen on line 2) is one way to make the module accessible from Python, a more conventional way is to set the Environment variable
PYTHONPATH
before calling your script.
The Python wrapper uses
ctypes to interface with Kvaser CANlib. This is a foreign function library for Python that provides C compatible data types and allows calling functions in DLLs or shared libraries. This means that it would also be possible to use these samples on Linux (but since kvrlib not yet is ported to Linux it is currently limited to CANlib).
In the next post, we will see how to connect to remote devices with Python...
EDIT 2015-05-22: Stated that the current wrappers are written for Python v2.7.[/vc_column_text][vc_column_text]
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][/vc_column][/vc_row]
[post_title] => [Archive] Accessing Kvaser CANlib from Python (1 of 3)
[post_excerpt] =>
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => archive-accessing-kvaser-canlib-python-1-3
[to_ping] =>
[pinged] =>
[post_modified] => 2022-12-21 23:38:00
[post_modified_gmt] => 2022-12-21 23:38:00
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?post_type=developer_blog&p=39843
[menu_order] => 0
[post_type] => developer_blog
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
)
[post_count] => 10
[current_post] => -1
[in_the_loop] =>
[post] => WP_Post Object
(
[ID] => 8035
[post_author] => 6
[post_date] => 2015-05-28 12:36:56
[post_date_gmt] => 2015-05-28 12:36:56
[post_content] => [vc_row][vc_column][vc_column_text]
Kvaser is participating in several CAN FD Tech Days in the Europe in 2015. Come along to hear about the latest CAN FD developments, answer your CAN FD questions, exchange views and network with CAN FD experts.
The events are as follows:[/vc_column_text][vc_column_text]
CAN FD Tech Day Stuttgart – 30
th June 2015
Kent Lennartson delivered a presentation on how to integrate CAN FD into a classical CAN architecture. Download the presentation
PDF here.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]
CAN FD Tech Day Prague – 24
th September 2015
Venue: Hotel Alwyn, Vitkova 26/151, 18600 Prague 8 - Karlin
Of special interest: CANopen FD. Presentations on this next generation data link layer and its impacts on system design and higher-layer protocols are part of this event.
CAN FD Tech Day Göteborg – 10
th December 2015
Venue: TBD
Of special interest: Presentations on this next generation data link layer and its impacts on system design and higher-layer protocols are part of this event. It serves as a platform for technical discussions and networking. At the accompanying tabletop exhibition, CAN-related products and services are displayed.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_separator_raket][vc_column_text]At each of the above events, Kvaser’s hardware manager, Kent Lennartsson, will present a paper entitled ‘CAN-FD FILTER FOR CLASSICAL CAN DEVICES AND PHYSICAL LAYER DIAGNOSTICS’. Use the form above to download it in advance.
You’ll also be able to see Kvaser’s CAN FD demonstrator in the tabletop exhibit. For more information and to register for any of the above events, please visit
www.can-cia.org.
For more information on CAN FD in general,
click here.[/vc_column_text][/vc_column][/vc_row]
[post_title] => Kvaser Presenting at CiA's CAN FD Tech Days Europe
[post_excerpt] => Come along to hear about the latest CAN FD developments, answer your CAN FD questions, exchange views and network with CAN FD experts.
Download the CAN FD presentation.
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => kvaser-presenting-at-cias-can-fd-tech-days-europe
[to_ping] =>
[pinged] =>
[post_modified] => 2022-09-29 04:14:13
[post_modified_gmt] => 2022-09-29 04:14:13
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://www.kvaser.com/?p=8035
[menu_order] => 0
[post_type] => post
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[comment_count] => 0
[current_comment] => -1
[found_posts] => 453
[max_num_pages] => 46
[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] => 674e834a25f1d7370a884791a2bf55a5
[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
)
)
Kvaser Presenting at CiA’s CAN FD Tech Days Europe
28/05/2015
Kvaser is participating in several CAN FD Tech Days in the Europe in 2015. Come along to hear about the latest CAN… Read More
Read More
Kvaser data loggers used to develop first ever 200bhp diesel outboard motor
26/05/2015
Until recently, petrol was the standard choice for most pleasure boat powerplants. More compact, lighter and more powerful than their… Read More
Read More
Double your CAN capabilities with the USBcan Light 2xHS
09/05/2015
New to Kvaser’s interface portfolio is the Kvaser USBcan Light 2xHS, a USB to dual channel Controller Area Network (CAN)… Read More
Read More
Was that the CANlib channel number or Card Number?
06/05/2015
When interacting with CANlib, many functions need a handle to a channel. This channel is often referred to as the… Read More
Read More
Easy Loopback Testing with the Kvaser T-cannector v2 and CanKing
05/05/2015
As engineers, we often like to see a piece of hardware work straight out of the box. This gives us… Read More
Read More
Getting Started with t Programming
29/04/2015
The new Kvaser Pro products have script feature called t. The t language is a ‘c like’, event oriented language.… Read More
Read More
Using Object Buffers
22/04/2015
Some of our interfaces are equipped with hardware buffers for automatic sending or responding to messages. They can be used… Read More
Read More
A more object oriented approach on accessing your Kvaser device from Python (3 of 3)
14/04/2015
This blog uses now deprecated functions, see blog “Improved API in Python canlib v1.5” for more information. This is the last post… Read More
Read More
Using Python to connect to your remote device (2 of 3)
08/04/2015
This blog uses now deprecated functions, see blog “Improved API in Python canlib v1.5” for more information. This is the second post… Read More
Read More
[Archive] Accessing Kvaser CANlib from Python (1 of 3)
01/04/2015
This blog uses now deprecated functions, see blog “Improved API in Python canlib v1.5” for more information. This is the first post… Read More
Read More