成人精品水蜜桃_成人在线丰满少妇av_91亚洲国产高清_欧美日韩免费区域视频在线观看

首頁 資訊 > 業界 > 正文

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據

在eTS調用C++方法的過程中,需要使用到Node_API、Cmake等工具來做中間轉換。

想了解更多關于開源的內容,請訪問:


(資料圖片)

清一色開源基礎軟件社區

https://ost.51cto.com

DevEco創建項目和模塊

創建項目只要是API9就行。

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

創建一個S7模塊要用到這個C++模板。

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

應用架構。整個應用架構可以分為三部分:C++側、eTS側、工具鏈。

C側:包含各種文件的引用、C或者C代碼、Node_API將C++函數與JavaScript關聯的信息等。eTS側:包含界面UI、自身方法,調用引用包的方法等。工具鏈:包含Cmake打包工具在內的系列工具。在eTS調用C++方法的過程中,需要使用到Node_API、Cmake等工具來做中間轉換,整個架構及其關聯關系如下:

調用、打包流程。

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

在eTS調用C++方法的過程中,調用、打包流程如下:

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

移植SNAP7到OpenHarmony

SNAP7移植框架文件在此開源倉庫的cpp文件夾里面。

庫文件:

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

cpp文件:

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

把上面文件加入編譯,加入hilog。

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

把測試代碼執行起來

在add中加入s7_main函數。

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

修改IP地址,機架號,插槽號,和DB塊讀取的地址。

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

在module.json5中添加網絡權限。

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

運行調試

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

基于OpenHarmony 系統通過S7協議讀取西門子PLC數據-開源基礎軟件社區

#include #include #include "snap7/snap7.h"#include "snap7/client.h"#include "hilog/log.h"#ifdef OS_WINDOWS# define WIN32_LEAN_AND_MEAN# include #endif     TS7Client *Client; byte Buffer[65536]; // 64 K buffer     int SampleDBNum = 1000;     char *Address = "10.168.100.2";     // PLC IP Address     int Rack = 0,Slot = 1; // Default Rack and Slot     int ok = 0; // Number of test pass     int ko = 0; // Number of test failure     bool JobDone=false;     int JobResult=0;//------------------------------------------------------------------------------//  Async completion callback //------------------------------------------------------------------------------// This is a simply text demo, we use callback only to set an internal flag...void S7API CliCompletion(void *usrPtr, int opCode, int opResult){    JobResult=opResult;    JobDone = true;}//------------------------------------------------------------------------------// SysSleep (copied from snap_sysutils.cpp) multiplatform millisec sleep//------------------------------------------------------------------------------void SysSleep(longword Delay_ms){#ifdef OS_WINDOWS    Sleep(Delay_ms);#else    struct timespec ts;    ts.tv_sec = (time_t)(Delay_ms / 1000);    ts.tv_nsec =(long)((Delay_ms - ts.tv_sec) * 1000000);    nanosleep(&ts, (struct timespec *)0);#endif}//------------------------------------------------------------------------------//  Usage Syntax//------------------------------------------------------------------------------void Usage(){    printf("Usage\n");    printf("  client  [Rack=0 Slot=2]\n");    printf("Example\n");    printf("  client 192.168.1.101 0 2\n");    printf("or\n");    printf("  client 192.168.1.101\n");    getchar();}//------------------------------------------------------------------------------// hexdump, a very nice function, it"s not mine.// I found it on the net somewhere some time ago... thanks to the author ;-)//------------------------------------------------------------------------------#ifndef HEXDUMP_COLS#define HEXDUMP_COLS 16#endifvoid hexdump(void *mem, unsigned int len){        unsigned int i, j;        for(i = 0; i < len + ((len % HEXDUMP_COLS) ? (HEXDUMP_COLS - len % HEXDUMP_COLS) : 0); i++)        {                /* print offset */                if(i % HEXDUMP_COLS == 0)                {                        printf("0x%04x: ", i);                }                /* print hex data */                if(i < len)                {                        printf("%02x ", 0xFF & ((char*)mem)[i]);                }                else /* end of block, just aligning for ASCII dump */                {                        printf("   ");                }                /* print ASCII dump */                if(i % HEXDUMP_COLS == (HEXDUMP_COLS - 1))                {                        for(j = i - (HEXDUMP_COLS - 1); j <= i; j++)                        {                                if(j >= len) /* end of block, not really printing */                                {                                        putchar(" ");                                }                                else if(isprint((((char*)mem)[j] & 0x7F))) /* printable char */                                {                                        putchar(0xFF & ((char*)mem)[j]);                                }                                else /* other char */                                {                                        putchar(".");                                }                        }                        putchar("\n");                }        }}//------------------------------------------------------------------------------// Check error//------------------------------------------------------------------------------bool Check(int Result, const char * function){    printf("\n");    printf("+-----------------------------------------------------\n");    printf("| %s\n",function);    printf("+-----------------------------------------------------\n");    if (Result==0) {        printf("| Result         : OK\n");        printf("| Execution time : %d ms\n",Client->ExecTime());        printf("+-----------------------------------------------------\n");        ok++;    }    else {        printf("| ERROR !!! \n");        if (Result<0)            printf("| Library Error (-1)\n");        else            printf("| %s\n",CliErrorText(Result).c_str());        printf("+-----------------------------------------------------\n");        ko++;    }    return Result==0;}//------------------------------------------------------------------------------// Multi Read//------------------------------------------------------------------------------void MultiRead(){     // Multiread buffers     byte MB[16]; // 16 Merker bytes     byte EB[16]; // 16 Digital Input bytes     byte AB[16]; // 16 Digital Output bytes     word TM[8];  // 8 timers     word CT[8];  // 8 counters     // Prepare struct     TS7DataItem Items[5];     // NOTE : *AMOUNT IS NOT SIZE* , it"s the number of items     // Merkers     Items[0].Area     =S7AreaMK;     Items[0].WordLen  =S7WLByte;     Items[0].DBNumber =0;        // Don"t need DB     Items[0].Start    =0;        // Starting from 0     Items[0].Amount   =16;       // 16 Items (bytes)     Items[0].pdata    =&MB;     // Digital Input bytes     Items[1].Area     =S7AreaPE;     Items[1].WordLen  =S7WLByte;     Items[1].DBNumber =0;        // Don"t need DB     Items[1].Start    =0;        // Starting from 0     Items[1].Amount   =16;       // 16 Items (bytes)     Items[1].pdata    =&EB;     // Digital Output bytes     Items[2].Area     =S7AreaPA;     Items[2].WordLen  =S7WLByte;     Items[2].DBNumber =0;        // Don"t need DB     Items[2].Start    =0;        // Starting from 0     Items[2].Amount   =16;       // 16 Items (bytes)     Items[2].pdata    =&AB;     // Timers     Items[3].Area     =S7AreaTM;     Items[3].WordLen  =S7WLTimer;     Items[3].DBNumber =0;        // Don"t need DB     Items[3].Start    =0;        // Starting from 0     Items[3].Amount   =8;        // 8 Timers     Items[3].pdata    =&TM;     // Counters     Items[4].Area     =S7AreaCT;     Items[4].WordLen  =S7WLCounter;     Items[4].DBNumber =0;        // Don"t need DB     Items[4].Start    =0;        // Starting from 0     Items[4].Amount   =8;        // 8 Counters     Items[4].pdata    =&CT;     int res=Client->ReadMultiVars(&Items[0],5);     if (Check(res,"Multiread Vars"))     {        // Result of Client->ReadMultivars is the "global result" of        // the function, it"s OK if something was exchanged.        // But we need to check single Var results.        // Let shall suppose that we ask for 5 vars, 4 of them are ok but        // the 5th is inexistent, we will have 4 results ok and 1 not ok.        printf("Dump MB0..MB15 - Var Result : %d\n",Items[0].Result);        if (Items[0].Result==0)            hexdump(&MB,16);        printf("Dump EB0..EB15 - Var Result : %d\n",Items[1].Result);        if (Items[1].Result==0)            hexdump(&EB,16);        printf("Dump AB0..AB15 - Var Result : %d\n",Items[2].Result);        if (Items[2].Result==0)            hexdump(&AB,16);        printf("Dump T0..T7 - Var Result : %d\n",Items[3].Result);        if (Items[3].Result==0)            hexdump(&TM,16);         // 8 Timers -> 16 bytes        printf("Dump Z0..Z7 - Var Result : %d\n",Items[4].Result);        if (Items[4].Result==0)            hexdump(&CT,16);         // 8 Counters -> 16 bytes     };}//------------------------------------------------------------------------------// List blocks in AG//------------------------------------------------------------------------------void ListBlocks(){    TS7BlocksList List;    int res=Client->ListBlocks(&List);    if (Check(res,"List Blocks in AG"))    {        printf("  OBCount  : %d\n",List.OBCount);    printf("  FBCount  : %d\n",List.FBCount);   printf("  FCCount  : %d\n",List.FCCount);   printf("  SFBCount : %d\n",List.SFBCount);   printf("  SFCCount : %d\n",List.SFCCount);   printf("  DBCount  : %d\n",List.DBCount);   printf("  SDBCount : %d\n",List.SDBCount);    };}//------------------------------------------------------------------------------// CPU Info : catalog//------------------------------------------------------------------------------void OrderCode(){     TS7OrderCode Info;     int res=Client->GetOrderCode(&Info);     if (Check(res,"Catalog"))     {          printf("  Order Code : %s\n",Info.Code);          printf("  Version    : %d.%d.%d\n",Info.V1,Info.V2,Info.V3);     };}//------------------------------------------------------------------------------// CPU Info : unit info//------------------------------------------------------------------------------void CpuInfo(){     TS7CpuInfo Info;     int res=Client->GetCpuInfo(&Info);     if (Check(res,"Unit Info"))     {          printf("  Module Type Name : %s\n",Info.ModuleTypeName);          printf("  Serial Number    : %s\n",Info.SerialNumber);          printf("  AS Name          : %s\n",Info.ASName);          printf("  Module Name      : %s\n",Info.ModuleName);     };}//------------------------------------------------------------------------------// CP Info//------------------------------------------------------------------------------void CpInfo(){     TS7CpInfo Info;     int res=Client->GetCpInfo(&Info);     if (Check(res,"Communication processor Info"))     {          printf("  Max PDU Length   : %d bytes\n",Info.MaxPduLengt);          printf("  Max Connections  : %d \n",Info.MaxConnections);          printf("  Max MPI Rate     : %d bps\n",Info.MaxMpiRate);          printf("  Max Bus Rate     : %d bps\n",Info.MaxBusRate);     };}//------------------------------------------------------------------------------// PLC Status//------------------------------------------------------------------------------void UnitStatus(){     int res=0;     int Status=Client->PlcStatus();     if (Check(res,"CPU Status"))     {          switch (Status)          {              case S7CpuStatusRun : printf("  RUN\n"); break;              case S7CpuStatusStop: printf("  STOP\n"); break;              default             : printf("  UNKNOWN\n"); break;          }     };}//------------------------------------------------------------------------------// Upload DB0 (surely exists in AG)//------------------------------------------------------------------------------void UploadDB0(){     int Size = sizeof(Buffer); // Size is IN/OUT par                                // In input it tells the client the size available                                // In output it tells us how many bytes were uploaded.     int res=Client->Upload(Block_SDB, 0, &Buffer, &Size);     if (Check(res,"Block Upload (SDB 0)"))     {          printf("Dump (%d bytes) :\n",Size);          hexdump(&Buffer,Size);     }}//------------------------------------------------------------------------------// Async Upload DB0 (using callback as completion trigger)//------------------------------------------------------------------------------void AsCBUploadDB0(){     int Size = sizeof(Buffer); // Size is IN/OUT par                                // In input it tells the client the size available                                // In output it tells us how many bytes were uploaded.     JobDone=false;     int res=Client->AsUpload(Block_SDB, 0, &Buffer, &Size);          if (res==0)     {         while (!JobDone)         {             SysSleep(100);         }         res=JobResult;     }         if (Check(res,"Async (callback) Block Upload (SDB 0)"))     {          printf("Dump (%d bytes) :\n",Size);          hexdump(&Buffer,Size);     }}//------------------------------------------------------------------------------// Async Upload DB0 (using event wait as completion trigger)//------------------------------------------------------------------------------void AsEWUploadDB0(){     int Size = sizeof(Buffer); // Size is IN/OUT par                                // In input it tells the client the size available                                // In output it tells us how many bytes were uploaded.     JobDone=false;     int res=Client->AsUpload(Block_SDB, 0, &Buffer, &Size);          if (res==0)     {         res=Client->WaitAsCompletion(3000);     }         if (Check(res,"Async (Wait event) Block Upload (SDB 0)"))     {          printf("Dump (%d bytes) :\n",Size);          hexdump(&Buffer,Size);     }}//------------------------------------------------------------------------------// Async Upload DB0 (using polling as completion trigger)//------------------------------------------------------------------------------void AsPOUploadDB0(){     int Size = sizeof(Buffer); // Size is IN/OUT par                                // In input it tells the client the size available                                // In output it tells us how many bytes were uploaded.     JobDone=false;     int res=Client->AsUpload(Block_SDB, 0, &Buffer, &Size);          if (res==0)     {         while (!Client->CheckAsCompletion(&res))         {             SysSleep(100);         };              }         if (Check(res,"Async (polling) Block Upload (SDB 0)"))     {          printf("Dump (%d bytes) :\n",Size);          hexdump(&Buffer,Size);     }}//------------------------------------------------------------------------------// Read a sample SZL Block//------------------------------------------------------------------------------void ReadSzl_0011_0000(){     PS7SZL SZL = PS7SZL(&Buffer);  // use our buffer casted as TS7SZL     int Size = sizeof(Buffer);     // Block ID 0x0011 IDX 0x0000 normally exists in every CPU     int res=Client->ReadSZL(0x0011, 0x0000, SZL, &Size);     if (Check(res,"Read SZL - ID : 0x0011, IDX 0x0000"))     {        printf("  LENTHDR : %d\n",SZL->Header.LENTHDR);        printf("  N_DR    : %d\n",SZL->Header.N_DR);        printf("Dump (%d bytes) :\n",Size);        hexdump(&Buffer,Size);     }}//------------------------------------------------------------------------------// Unit Connection//------------------------------------------------------------------------------bool CliConnect(){    Client->SetConnectionType(3);    int res = Client->ConnectTo(Address,Rack,Slot);    if (Check(res,"UNIT Connection")) {          printf("  Connected to   : %s (Rack=%d, Slot=%d)\n",Address,Rack,Slot);          printf("  PDU Requested  : %d bytes\n",Client->PDURequested());          printf("  PDU Negotiated : %d bytes\n",Client->PDULength());    };    return res==0;}//------------------------------------------------------------------------------// Unit Disconnection//------------------------------------------------------------------------------void CliDisconnect(){     Client->Disconnect();}//------------------------------------------------------------------------------// Perform readonly tests, no cpu status modification//------------------------------------------------------------------------------void PerformTests(){     OrderCode();     CpuInfo();     CpInfo();     UnitStatus();     ReadSzl_0011_0000();     UploadDB0();     AsCBUploadDB0();     AsEWUploadDB0();     AsPOUploadDB0();     MultiRead();}//------------------------------------------------------------------------------// Tests Summary//------------------------------------------------------------------------------void Summary(){    printf("\n");    printf("+-----------------------------------------------------\n");    printf("| Test Summary \n");    printf("+-----------------------------------------------------\n");    printf("| Performed : %d\n",(ok+ko));    printf("| Passed    : %d\n",ok);    printf("| Failed    : %d\n",ko);    printf("+----------------------------------------[press a key]\n");    getchar();}float GetPLCData(){    float value0 = 0;    byte value1[4]= {0};    Client->DBRead(1,1244,4,value1);    *((byte*)&value0 + 0) = value1[3];    *((byte*)&value0 + 1) = value1[2];    *((byte*)&value0 + 2) = value1[1];    *((byte*)&value0 + 3) = value1[0];            return value0;}//------------------------------------------------------------------------------// Main              //------------------------------------------------------------------------------float s7_main(){        float result = 0;                Client = new TS7Client();        Client->SetConnectionType(3);        Client->ConnectTo("192.168.1.2", 0, 1); //PLC的IP地址,機架號,插槽號                        OH_LOG_Print(LOG_APP, LOG_INFO, 0xFF00, "PluginManager", "[S7 CONNECT]Connected");                if(Client->Connected() == true){            OH_LOG_Print(LOG_APP, LOG_INFO, 0xFF00, "PluginManager", "[S7 CONNECT]連接成功");        }                float value0 = 0;        byte value1[4]= {0};        Client->DBRead(1,1111,4,value1);        *((byte*)&value0 + 0) = value1[3];        *((byte*)&value0 + 1) = value1[2];        *((byte*)&value0 + 2) = value1[1];        *((byte*)&value0 + 3) = value1[0];            result = value0;                                delete Client;            return result;}

想了解更多關于開源的內容,請訪問:

清一色開源基礎軟件社區

https://ost.51cto.com

關鍵詞:

最近更新

關于本站 管理團隊 版權申明 網站地圖 聯系合作 招聘信息

Copyright © 2005-2023 創投網 - m.7778890.com All rights reserved
聯系我們:39 60 29 14 2@qq.com
皖ICP備2022009963號-3

成人精品水蜜桃_成人在线丰满少妇av_91亚洲国产高清_欧美日韩免费区域视频在线观看
国产视频精品网| 欧美国产精品v| 91精品福利在线| 性一交一乱一区二区洋洋av| 亚洲激情午夜| 亚洲国产激情| 9国产精品视频| 亚洲在线观看| 色婷婷久久综合| 欧美日本国产视频| 日韩三级精品电影久久久 | 国产精品亲子伦对白| 国产精品美女久久久久久久网站| 国产日本亚洲高清| 亚洲精品久久久蜜桃| 亚洲国产精品麻豆| 久久er99热精品一区二区| 久久99国产精品久久99| 国产高清精品久久久久| 噜噜噜在线观看免费视频日韩| 国产精品久久九九| 欧美伊人久久大香线蕉综合69| 91精品国产欧美一区二区成人 | 久久久亚洲精华液精华液精华液| 欧美精品一区二区三区四区| 国产欧美日韩亚州综合| 亚洲精品国久久99热| 日本麻豆一区二区三区视频| 捆绑变态av一区二区三区| 不卡的电视剧免费网站有什么| 欧美久久电影| 亚洲综合丁香| 欧美一区二区三区啪啪| 国产精品久久三区| 免费在线看一区| eeuss鲁片一区二区三区 | 国产日韩欧美不卡在线| 一区二区欧美视频| 国产一区二区三区香蕉| 国产精品成人观看视频免费| 免费亚洲一区| 2020国产精品久久精品美国| 一区二区日韩电影| 国产成人av一区二区三区在线| 欧美日韩精品不卡| 欧美性大战久久久久久久| 国产午夜精品理论片a级大结局 | 亚洲国产精品久久久久婷婷老年 | 亚洲午夜久久久久久久久久久| 狠狠色丁香九九婷婷综合五月| 欧美激情1区2区| 久久中文精品| 国产人伦精品一区二区| 韩国理伦片一区二区三区在线播放| 91视频免费看| 欧美色大人视频| 亚洲欧洲日韩av| 国产91丝袜在线18| 免费一区视频| 中文字幕一区日韩精品欧美| 狠狠色丁香久久婷婷综| 国产精品一区二区在线观看| 欧美成人精品高清在线播放| 日日夜夜一区二区| 伊人久久亚洲美女图片| 日韩欧美成人一区二区| 奇米精品一区二区三区在线观看| 国产精品二区在线| 精品国产一区二区在线观看| 首页国产欧美久久| 国产欧美69| 国产精品久久久久久久久免费樱桃| 久久91精品国产91久久小草| 99综合在线| 中文字幕日韩精品一区| 99视频有精品| 91精品国产色综合久久不卡蜜臀 | 日本欧美大码aⅴ在线播放| 国产精品v日韩精品v欧美精品网站| 91精品国产手机| 久久9热精品视频| 在线欧美日韩国产| 亚洲午夜精品17c| 国产欧美69| 一区二区理论电影在线观看| 黄色国产精品| 国产精品网站在线观看| 91视频www| 久久这里只有精品视频网| 国产成人自拍在线| 日韩一二在线观看| 国产成人亚洲精品青草天美| 欧美欧美欧美欧美| 国产在线精品不卡| 欧美日韩黄色一区二区| 美洲天堂一区二卡三卡四卡视频| 久久国产日本精品| 天天操天天干天天综合网| 嫩草成人www欧美| 天天亚洲美女在线视频| 久久精品五月| 美女视频黄久久| 欧美日韩国产影片| 国产成人在线影院| 欧美成人vr18sexvr| 97久久精品人人澡人人爽| 久久久影视传媒| 欧美午夜在线视频| 亚洲天堂福利av| 亚洲欧美激情诱惑| 日韩精品免费专区| 欧美日韩一区国产| 成人av电影在线网| 欧美高清在线视频| 国产精品一区二区在线观看 | 成人网在线免费视频| 久久亚洲一区二区三区四区| 欧美女人交a| 亚洲精品视频在线看| 媚黑女一区二区| 国产又粗又猛又爽又黄91精品| 6080亚洲精品一区二区| www.av亚洲| 亚洲蜜臀av乱码久久精品| 久久久久久久欧美精品| 国产又黄又大久久| 国产日本欧美一区二区| 亚洲精品三级| 久久国产生活片100| 精品久久一区二区三区| 在线播放不卡| 蜜臀99久久精品久久久久久软件| 日韩亚洲欧美一区二区三区| 亚洲欧美伊人| 午夜国产精品一区| 精品乱人伦小说| 日韩视频精品| 国产一区二区三区日韩| 中文字幕av资源一区| 老妇喷水一区二区三区| www.亚洲色图.com| 亚洲一区二区综合| 日韩视频一区在线观看| 亚洲区第一页| 国产成人综合精品三级| 亚洲啪啪综合av一区二区三区| 欧美日韩一二三| 国产自产精品| 黄色日韩网站视频| 亚洲激情自拍视频| 欧美成人高清电影在线| 欧美videos中文字幕| 国产精品手机在线| 成人国产精品免费观看动漫 | 99免费精品在线| 亚洲大型综合色站| 久久久久亚洲蜜桃| 欧美色精品在线视频| 91久久久久| 波多野结衣中文一区| 日韩av一二三| 日韩久久一区二区| 日韩午夜中文字幕| 久久xxxx精品视频| 欧美日本韩国一区二区三区| 久久国内精品视频| 亚洲1区2区3区4区| 国产精品美女久久久久久久| 91精品国产免费久久综合| 久久国产精品久久精品国产| 欧美一区二区在线| 狠狠色丁香久久婷婷综合丁香| 伊人婷婷欧美激情| 欧美高清一级片在线观看| 欧美一区二区三区四区久久| 91久久人澡人人添人人爽欧美| 狠狠色噜噜狠狠狠狠色吗综合| 成人午夜短视频| 久久国产生活片100| 视频一区二区三区入口| 亚洲视频狠狠干| 欧美国产精品v| 国产视频一区二区在线| 精品久久一区二区三区| 欧美一区二区精美| 欧美人动与zoxxxx乱| 色狠狠一区二区| 久久久久久九九九九| 在线一区亚洲| 亚洲精品麻豆| 亚洲精品美女| 亚洲大片av| 91久久午夜| 9国产精品视频| 国产伦精品一区二区| 一区二区三区四区五区精品视频| 欧美色图麻豆| 国产精品豆花视频| 伊人久久综合| 影音欧美亚洲|