{"id":20179,"date":"2025-07-01T11:39:21","date_gmt":"2025-07-01T03:39:21","guid":{"rendered":"https:\/\/www.tosunai.com\/?p=20179"},"modified":"2025-07-01T11:48:15","modified_gmt":"2025-07-01T03:48:15","slug":"tsmasterapi-plugin-import-and-ecutest-co-simulation-guide","status":"publish","type":"post","link":"https:\/\/www.tosunai.com\/en\/tsmasterapi-plugin-import-and-ecutest-co-simulation-guide\/","title":{"rendered":"Sharing | TSMasterAPI Plugin Import and ECUTEST Co-Simulation Guide"},"content":{"rendered":"

In automotive electronic ECU development and testing, joint simulation has become a key means to improve testing efficiency and ensure system stability. And TSMaster, as a comprehensive tool for automotive electronic simulation and testing, combined with ECUTEST's professional testing capabilities, can realize efficient automated testing. In this article, we will introduce in detail how to import TSMaster API plug-ins and explain the core API interface functions.<\/p>\n\n\n\n

<\/p>\n\n\n\n

Keywords:TSMasterAPI, ECUTEST, API Interface<\/strong><\/strong><\/p>\n\n\n\n

<\/div>\n\n\n\n

1<\/strong>. TSMasterAPI Plugin<\/strong><\/strong><\/strong><\/strong><\/strong><\/h2>\n\n\n\n
\n\n\n\n

Currently, TSMaster provides programmable TSMaster software and hardware interfaces for the majority of ecutest users, and the corresponding interface names can be viewed in the ECUTEST software.<\/p>\n\n\n\n

Program control TSMaster UI interface to realize SIL simulation interface name: TSOUN: TSMaster SIL Kit; program control TOSUN hardware products to realize SIL simulation interface name: TOSUN: Hardware SIL Kit. as shown in the figure below:<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

1.1 Importing TSMasterAPI<\/strong><\/h3>\n\n\n\n

1.1.1 Deploying the plug-in<\/p>\n\n\n\n

TOSUN official will provide ECUTEST plug-in environment when installing TSMaster, users can choose whether to install the plug-in or not, the same way as installing C++\\Python environment to check the box to install.<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

Meanwhile, if you want to use the plug-in at the first time, you can contact TOSUN sales or technology at the same time to get the plug-in package, and then manually put it into the ECUTEST software, the location of which is shown in the figure below:<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

1.1.2 Workspace Import Plugin<\/p>\n\n\n\n

When you create ECUTEST workspace, check \u201cShow workspace settings\u201d -> \u201cCopy tutorial files\u201d -> select \u201cTSMasterAPI\u201d -> \u2018OK\u2019, you can see \u201cTSOUN: TSMaster SATURDAY\u201d in the workspace. \u201cTSMasterAPI\u201d -> \u2018OK\u2019, then you can see \u201cTSOUN: TSMaster SIL Kit\u201d and \u201cTSOUN: Hardware SIL Kit\u201d in the workspace.<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

1.2 <\/strong>TOSUN: TSMaster SIL Kit<\/strong><\/h3>\n\n\n\n

1.2.1 Create test bench configuration<\/p>\n\n\n\n

First create \u201ctest bench configruation\u201d -> \u201cnew create new tool host\u201d -> \"Local \u201c; then you can see \u201dTOSUN: TSMaster SIL Kit\" in the tool host window.<\/p>\n\n\n\n

Right click \u201cTOSUN: TSMaster SIL Kit\u201d -> \u201cAdd tool\u201d -> \"TSMaster_project_path In \u201cTSMaster_project_path\u201d, fill in the project path of TSMaster and click save.<\/p>\n\n\n\n

(1) Create \u201ctest bench configruation\u201d.<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

\uff082\uff09\u201cCreate new tool host\u201d<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

\uff083\uff09\u201cTOSUN: TSMaster SIL Kit\u201d->\u201cAdd tool\u201d<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

(4) \u201cSave\u201d<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

(5) \u201cStart\u201d<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

\uff086\uff09\u201cConnect tool\u201d<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

(7) Interface call<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

1.3 TOSUN\uff1a<\/strong>Hardware SIL Kit<\/strong><\/h3>\n\n\n\n

1.3.1 Creating a test bench configuration<\/p>\n\n\n\n

First create \u201ctest bench configruation\u201d -> \u201cnew create new tool host\u201d -> \"Local \u201c; then you can see \u201dTOSUN: Hardware SIL Kit\" in the tool host window. Right click \u201cTOSUN: TSMaster SIL Kit\u201d -> \u201cAdd tool\u201d -> \u201cTSMaster_App_Name\u201d. Fill in the application name of TSMaster and click Save.<\/p>\n\n\n\n

(1) Create \u201ctest bench configruation\u201d.<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

\uff082\uff09\u201cCreate new tool host\u201d<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

\uff083\uff09\u201cTOSUN: TSMaster SIL Kit\u201d->\u201cAdd tool\u201d<\/p>\n\n\n\n

\"\"<\/figure>\n\n\n\n

<\/p>\n\n\n\n

(4) \u201cSave\u201d<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

(5) \u201cStart\u201d<\/p>\n\n\n

\n
\"TSMasterAPI\u63d2\u4ef6\u5bfc\u5165\u4e0eECUTEST\"<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

\uff086\uff09\u201cConnect tool\u201d<\/p>\n\n\n\n

\"\"<\/figure>\n\n\n\n

<\/p>\n\n\n\n

(7) Interface call<\/p>\n\n\n\n

\"\"<\/figure>\n\n\n\n
<\/div>\n\n\n\n

2. <\/strong><\/strong><\/strong><\/strong><\/strong><\/strong>TSMasterAPI Interface Description<\/strong><\/h2>\n\n\n\n
\n\n\n\n

2.1 TOSUN: TSMaster SIL Kit<\/strong><\/h3>\n\n\n\n

2.1.1 start_simulation<\/p>\n\n\n\n

Parameter name<\/td>start_simulation()<\/td><\/tr>
Function<\/td>RPC client startup server TSMaster emulation<\/td><\/tr>
call location<\/td>After creating the rpc client, call<\/td><\/tr>
Input parameter<\/td>None<\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>start_simulation()<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.2 simulation_is_running<\/p>\n\n\n\n

Parameter name<\/td>simulation_is_running()<\/td><\/tr>
Function<\/td>Returns whether the server-side TSMaster has emulation enabled or not<\/td><\/tr>
call location<\/td>After creating the rpc client, call<\/td><\/tr>
Input parameter<\/td>None<\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>ret =simulation_is_running()
if ret:
print(\u201cEmulation is turned on\u201d)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.3 stop_simulation<\/p>\n\n\n\n

Parameter name<\/td>stop_simulation()<\/td><\/tr>
Function<\/td>RPC client stops server side TSMaster emulation<\/td><\/tr>
call location<\/td>After creating the rpc client, call<\/td><\/tr>
Input parameter<\/td>None<\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>stop_simulation()<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.4 get_sysvar_value<\/p>\n\n\n\n

Parameter name<\/td>get_sysvar_value(SysvarName:str)->(errorcode, double)<\/td><\/tr>
Function<\/td>Getting system variable values<\/td><\/tr>
call location<\/td>Called after activating the rpc client<\/td><\/tr>
Input parameter<\/td>SysvarName: System Variable Name<\/mark><\/td><\/tr>
Return value<\/td>==Ret[0]: error code, ==0 for success, other failures
Ret[1]:Signal value<\/td><\/tr>
Typical example<\/td>ret,value = get_sysvar_value(‘Var0’)
if ret == 0 and value==100:
Print(“ok”)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.5 set_sysvar_value<\/p>\n\n\n\n

Parameter name<\/td>get_sysvar_value(SysvarName:str, value:double)->errorcode<\/td><\/tr>
Function<\/td>Getting system variable values<\/td><\/tr>
call location<\/td>Called after activating the rpc client<\/td><\/tr>
Input parameter<\/td>SysvarName: System Variable Name
Value: Setting value<\/mark><\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>set = set_sysvar_value(‘Var0’ ,100)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.6 get_cansignal_value<\/p>\n\n\n\n

Parameter name<\/td>get_cansignal_value(cansignalName:str)->(errorcode, double)<\/td><\/tr>
Function<\/td>Getting system variable values<\/td><\/tr>
call location<\/td>Called after activating the rpc client<\/td><\/tr>
Input parameter<\/td>cansignalName: signal address<\/mark><\/td><\/tr>
Return value<\/td>==Ret[0]: error code, ==0 for success, other failures
Ret[1]:Signal value<\/td><\/tr>
Typical example<\/td>ret, value = get_cansignal_value( ‘0\/CAN_FD_Powertrain\/Engine\/ABSdata\/CarSpeed’)
if ret == 0 and value==100:
Print(“ok”)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.7 set_cansignal_value<\/p>\n\n\n\n

Parameter name<\/td>set_cansignal_value (cansignal:str, value:double)->errorcode<\/td><\/tr>
Function<\/td>Setting system variable values<\/td><\/tr>
call location<\/td>Called after activating the rpc client<\/td><\/tr>
Input parameter<\/td>cansignalName: signal address<\/mark>
Value: Setting value<\/mark><\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>sset_cansignal_value( ‘0\/CAN_FD_Powertrain\/Engine\/ABSdata\/CarSpeed, 100)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.8 get_linsignal_value<\/p>\n\n\n\n

Parameter name<\/td>get_linsignal_value (linsignalName:str)->(errorcode, double)<\/td><\/tr>
Function<\/td>Getting system variable values<\/td><\/tr>
call location<\/td>Called after activating the rpc client<\/td><\/tr>
Input parameter<\/td>LinsignalName: signal address<\/mark><\/mark><\/td><\/tr>
Return value<\/td>==Ret[0]: error code, ==0 for success, other failures
Ret[1]:Signal value<\/td><\/tr>
Typical example<\/td>ret,value = get_linsignal_value( ‘0\/LIN_Powertrain\/Engine\/ABSdata\/CarSpeed)
if ret == 0 and value==100:
Print(“ok”)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.9 set_linsignal_value<\/p>\n\n\n\n

Parameter name<\/td>set_linsignal_value (linsignal:str, value:double)->errorcode<\/td><\/tr>
Function<\/td>Setting system variable values<\/td><\/tr>
call location<\/td>Called after activating the rpc client<\/td><\/tr>
Input parameter<\/td>LinsignalName: signal address<\/mark>
Value: Setting value<\/mark><\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>set_linsignal_value( ‘0\/LIN_Powertrain\/Engine\/ABSdata\/CarSpeed, 100)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.10 get_frsignal_value<\/p>\n\n\n\n

Parameter name<\/td>get_frsignal_value (frsignalName:str)->(errorcode, double)<\/td><\/tr>
Function<\/td>Getting system variable values<\/td><\/tr>
call location<\/td>Called after activating the rpc client<\/td><\/tr>
Input parameter<\/td>frsignalName: signal address<\/mark><\/mark><\/td><\/tr>
Return value<\/td>==Ret[0]: error code, ==0 for success, other failures
Ret[1]:Signal value<\/td><\/tr>
Typical example<\/td>ret,value = get_frsignal_value( ‘0\/FR_Powertrain\/Engine\/ABSdata\/CarSpeed)
if ret == 0 and value==100:
Print(“ok”)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.1.11 set_frsignal_value<\/strong><\/p>\n\n\n\n

Parameter name<\/td>set_frsignal_value (frsignal:str, value:double)->errorcode<\/td><\/tr>
Function<\/td>Setting system variable values<\/td><\/tr>
call location<\/td>Called after activating the rpc client<\/td><\/tr>
Input parameter<\/td>frsignalName: signal address<\/mark><\/mark>
Value: Setting value<\/mark><\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>set_frsignal_value( ‘0\/FR_Powertrain\/Engine\/ABSdata\/CarSpeed, 100)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.2 TOSUN: Hardware SIL Kit<\/strong><\/h3>\n\n\n\n

2.2.1 set_hardware_config<\/p>\n\n\n\n

Parameter name<\/td>set_hardware_config()->error_code<\/td><\/tr>
Function<\/td>Configuring hardware devices for the current program<\/td><\/tr>
call location<\/td>Called before connecting, can be left out if not in the case of modifying the channel configuration<\/td><\/tr>
Input parameter<\/td>None<\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>set_hardware_config()<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.2.2 connect<\/p>\n\n\n\n

Parameter name<\/td>connect()->error_code<\/td><\/tr>
Function<\/td>Connecting Hardware Devices<\/td><\/tr>
call location<\/td>After configuring the hardware channel<\/td><\/tr>
Input parameter<\/td>None<\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>connect()<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.2.3 disconnect<\/p>\n\n\n\n

Parameter name<\/td>disconnect()->error_code<\/td><\/tr>
Function<\/td>Disconnect hardware devices<\/td><\/tr>
call location<\/td>After configuring the hardware channel<\/td><\/tr>
Input parameter<\/td>None<\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>disconnect()<\/mark><\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.2.4 send_msg<\/p>\n\n\n\n

Parameter name<\/td>send_msg(AMsg:TLIBCAN|TLIBCANFD|TLIBLIN|TLIBFlexRay)->error_code<\/td><\/tr>
Function<\/td>Single-frame transmitter message<\/td><\/tr>
call location<\/td>After connecting the hardware<\/td><\/tr>
Input parameter<\/td>AMsg: message object<\/mark><\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>AMsg = TLIBCAN(0x123)
send_msg(AMsg)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.2.5 send_cyclic_can_msg<\/p>\n\n\n\n

Parameter name<\/td>send_cyclic_can_msg (AMsg:TLIBCAN|TLIBCANFD, ATime)->error_code<\/td><\/tr>
Function<\/td>Cyclic transmission of CAN\/CANFD messages<\/td><\/tr>
call location<\/td>After connecting the hardware<\/td><\/tr>
Input parameter<\/td>AMsg: message object<\/mark>
ATime: period, time in ms 1 means 1ms 100 means 100ms<\/mark><\/td><\/tr>
Return value<\/td>==0: function executed successfully
Other values: function execution failed<\/td><\/tr>
Typical example<\/td>AMsg = TLIBCAN(0x123)
send_cyclic_can_msg(AMsg, 100)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.2.6 recv_can_msg<\/p>\n\n\n\n

Parameter name<\/td>recv_can_msg (AChnidx, ACount, IsIncludeTx)->AMsgList<\/td><\/tr>
Function<\/td>Cyclic transmission of CAN\/CANFD messages<\/td><\/tr>
call location<\/td>After connecting the hardware<\/td><\/tr>
Input parameter<\/td>AChnidx: Specified channel for incoming messages
ACount: Maximum number of received messages
IsIncludeTx: Whether or not to include sent messages<\/mark><\/td><\/tr>
Return value<\/td>AMsgList: list of received messages<\/mark><\/td><\/tr>
Typical example<\/td>AMsgs = recv_can_msg(0, 100, False)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.2.7 recv_lin_msg<\/p>\n\n\n\n

Parameter name<\/td>recv_lin_msg(AChnidx, ACount, IsIncludeTx)->AMsgList<\/td><\/tr>
Function<\/td>Receive lin messages<\/td><\/tr>
call location<\/td>After connecting the hardware<\/td><\/tr>
Input parameter<\/td>AChnidx: Specified channel for incoming messages
ACount: Maximum number of received messages
IsIncludeTx: Whether or not to include sent messages<\/mark><\/td><\/tr>
Return value<\/td>AMsgList: list of received messages<\/mark><\/td><\/tr>
Typical example<\/td>AMsgs = recv_lin_msg(0, 100, False)send_msg(AMsg)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n

<\/p>\n\n\n\n

2.2.8 recv_flexray_msg<\/p>\n\n\n\n

Parameter name<\/td>recv_flexray_msg(AChnidx, ACount, IsIncludeTx)->AMsgList<\/td><\/tr>
Function<\/td>Receive flexray messages<\/td><\/tr>
call location<\/td>After connecting the hardware<\/td><\/tr>
Input parameter<\/td>AChnidx: Specified channel for incoming messages
ACount: Maximum number of received messages
IsIncludeTx: Whether or not to include sent messages<\/mark><\/td><\/tr>
Return value<\/td>AMsgList: list of received messages<\/mark><\/td><\/tr>
Typical example<\/td>AMsgs = recv_flexary_msg(0, 100, False)<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n
<\/div>\n\n\n\n

Which feature of TSMaster are you most interested in? Or what problems have you encountered in practical applications?<\/strong><\/p>\n\n\n\n

Welcome to share your experience or questions in the comment section, any ideas or suggestions can also be comment section message interaction, will have the opportunity to win the TOSUN mystery gift bag Oh ~!<\/strong><\/p>\n\n\n\n

\n
\n
Tip:<\/strong>
1. Software download:
Click on the software download link below to download and install directly, beta version is recommended:

2. Software upgrades:
You can check for upgrades to the latest version within the software, provided that your computer has an Internet connection.

Note: TOSUN Technical Support Email:support@tosunai.cn<\/a>We welcome inquiries! (Company and contact information must be indicated)<\/strong><\/pre>\n\n\n\n
\n
Download TSMaster<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"

\u5728\u6c7d\u8f66\u7535\u5b50ECU\u5f00\u53d1\u4e0e\u6d4b\u8bd5\u4e2d\uff0c\u8054\u5408\u4eff\u771f\u5df2\u6210\u4e3a\u63d0\u9ad8\u6d4b\u8bd5\u6548\u7387\u3001\u786e\u4fdd\u7cfb\u7edf\u7a33\u5b9a\u6027\u7684\u5173\u952e\u624b\u6bb5\u3002\u800cTSMaster\u4f5c\u4e3a\u6c7d\u8f66 […]<\/p>","protected":false},"author":11,"featured_media":20197,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"","ocean_second_sidebar":"","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"","ocean_custom_header_template":"","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"","ocean_menu_typo_font_family":"","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"","ocean_post_oembed":"","ocean_post_self_hosted_media":"","ocean_post_video_embed":"","ocean_link_format":"","ocean_link_format_target":"self","ocean_quote_format":"","ocean_quote_format_link":"post","ocean_gallery_link_images":"on","ocean_gallery_id":[],"footnotes":"[]"},"categories":[90],"tags":[65,131,140],"class_list":{"0":"post-20179","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-software-tutorial","8":"tag-tsmaster","10":"tag-simulation","11":"entry","12":"has-media","13":"owp-thumbs-layout-horizontal","14":"owp-btn-normal","15":"owp-tabs-layout-horizontal","16":"has-no-thumbnails","17":"has-product-nav"},"acf":[],"_links":{"self":[{"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/posts\/20179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/comments?post=20179"}],"version-history":[{"count":3,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/posts\/20179\/revisions"}],"predecessor-version":[{"id":20201,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/posts\/20179\/revisions\/20201"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/media\/20197"}],"wp:attachment":[{"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/media?parent=20179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/categories?post=20179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/tags?post=20179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}