chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用PCIE主站卡控制IO從站step by step(二)

ZLG致遠電子 ? 2024-05-24 08:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

ZLG致遠電子的PCIe EtherCAT通訊卡該如何使用?PDO過程數(shù)據(jù)該如何操作?具體編程又該如何實現(xiàn)?續(xù)接上一章節(jié),本文將為您詳細講解。

EtherCAT工業(yè)總線技術(shù)在工業(yè)自動化領(lǐng)域展現(xiàn)出了廣泛的應(yīng)用價值,特別是在運動控制、機器人技術(shù)和測量技術(shù)等方面。ZLG致遠電子 PCIe EtherCAT通訊卡 基于自主知識產(chǎn)權(quán)的系統(tǒng)之上開發(fā),實現(xiàn)了軟硬件間的無縫連接,極大地提升了系統(tǒng)的穩(wěn)定性、可靠性以及安全性。同時,該通訊卡還支持線路冗余以及熱插拔功能,可輕松實現(xiàn)多軸同步控制和數(shù)據(jù)的高速傳輸。此外,ZLG致遠電子PCIe EtherCAT通訊卡還為用戶提供了便捷的二次開發(fā)庫,支持VC、C#Linux、Python等各類主流開發(fā)環(huán)境,滿足客戶不同層次的開發(fā)需求。值得一提的是,ZLG致遠電子PCIe EtherCAT通訊卡通過將商業(yè)級EtherCAT主站協(xié)議和實時內(nèi)核相結(jié)合的方式,有效釋放主機資源,完美解決傳統(tǒng)EtherCAT主站在非實時操作系統(tǒng)下運行所帶來的各類問題,為用戶帶來了更加高效、穩(wěn)定的解決方案。0d7904f2-1964-11ef-bebc-92fbcf53809c.png圖1PCIeEtherCAT通訊卡表1PCIeEtherCAT通訊卡型號

0d9ad726-1964-11ef-bebc-92fbcf53809c.png

基于上一章《使用PCIe EtherCAT通訊卡控制IO從站step by step(一)》中所講訴的內(nèi)容,我們已經(jīng)完成了開發(fā)環(huán)境的搭建,以及主函數(shù)的建立,接下來,我們將會進一步完善主函數(shù)中的代碼,實現(xiàn)對從站的PDO數(shù)據(jù)讀寫。

1. 代碼編寫

打開ecat_api_io_test.cpp文件。根據(jù)AWStudio軟件導(dǎo)出的eni文件定義過程數(shù)據(jù)的結(jié)構(gòu)體,打開eni文件,移動光標(biāo)到文件尾部,找到注釋的節(jié)點ENI_PDO_LIST。0dbc29c6-1964-11ef-bebc-92fbcf53809c.png圖2ENI文件(1)0dd7b498-1964-11ef-bebc-92fbcf53809c.png圖3ENI文件(2)節(jié)點中的inputs為從站返回的PDO過程數(shù)據(jù),outputs為主站發(fā)送到從站的PDO過程數(shù)據(jù),根據(jù)每個變量的位寬bit_size,我們可以定義對應(yīng)的類型。

根據(jù)圖2的信息,我們可以看出輸出有三個變量,DI_1,AI_1,AI_2,長度分別為8位,8位,16位,輸入有三個變量DO_1,AO_1,AO_2,長度分別位8位,8位,16位,定義結(jié)構(gòu)體:

//過程數(shù)據(jù),寫入從站的數(shù)據(jù)格式typedef struct{ uint8_t DI_1; uint8_t AI_1; uint16_t AI_2;}PDO_OUTPUTS_T;
//過程數(shù)據(jù),從站返回的數(shù)據(jù)格式typedef struct{ uint8_t DO_1; uint8_t AO_1; uint16_t AO_2;}PDO_INPUTS_T;

定義完過程數(shù)據(jù)的結(jié)構(gòu)體后。

第一步,輸入需要控制的pcie卡別名以及通道號,獲取Ecat控制句柄。

EXIT_IF_FAIL(EcatOpen(&hHandle, BOARD_ALIAS(buff, alias), channel));

第二步,輸入上位機程序?qū)С龅膃ni文件,啟動Ecat主站。

EXIT_IF_FAIL(EcatBusRun(hHandle, fileName));

第三步,將Ecat主站狀態(tài)切換為8(Operational)。

EXIT_IF_FAIL(EcatRequestMasterState(hHandle, EcatStateO));

等待主站切換狀態(tài)。

uint8_t query = EcatStateNotSet;do{ EXIT_IF_FAIL(EcatGetMasterState(hHandle, &query)); //輸出當(dāng)前狀態(tài) _DBG_("request_state=%d, query_state=%d", EcatStateO, query); if (query == EcatStateO){ break;; } std::sleep_for(std::seconds(1));}while(1);

第四步,定義PDO過程數(shù)據(jù)的指針并指向本地緩存空間,這一步將會讓我們更加方便快捷地讀寫PDO數(shù)據(jù)。

0df5f5b6-1964-11ef-bebc-92fbcf53809c.png圖4PDO數(shù)據(jù)的收發(fā)原理執(zhí)行EcatPINMap函數(shù),將會修改第3個參數(shù)inputBuff,outputBuff的指向,讓其直接指向本地輸入輸出緩存區(qū),固不需要再額外申請空間。

PDO_OUTPUTS_T *outputBuff;PDO_INPUTS_T *inputBuff;//將指針inputBuff,outputBuff分別指向本地緩存的空間EXIT_IF_FAIL(EcatPINMap(hHandle, PI_AREA_LOCAL_INPUT, (void**)&inputBuff));EXIT_IF_FAIL(EcatPINMap(hHandle, PI_AREA_LOCAL_OUTPUT, (void**)&outputBuff));

第五步,向發(fā)送隊列中添加空數(shù)據(jù),添加空數(shù)據(jù)的數(shù)量取決于PC系統(tǒng)抖動的程度,抖動越小,添加的空數(shù)據(jù)越少,控制指令的滯后性越小。

for(auto i = 0; i < 2; i++){ ? ?EcatPIOutputQueuePush(hHandle, false, 100);}

第六步,使能過程數(shù)據(jù)PDO通信。

EXIT_IF_FAIL(EcatPIEnable(hHandle));

第七步,通過EcatPIInputQueuePop接口,等待從站數(shù)據(jù)返回,然后讀寫PDO過程數(shù)據(jù),最后調(diào)用EcatPIOutputQueuePush接口將數(shù)據(jù)添加到發(fā)送隊列。當(dāng)前例子中,在收到從站返回的數(shù)據(jù)后,主站會將收到的輸入數(shù)據(jù)寫到輸出的變量。

bool loopFlag = true;while(loopFlag){ //阻塞式等待PDO數(shù)據(jù) if (!EcatPIInputQueuePop(hHandle, false, 100)){ /*********************************************************/ //修改過程數(shù)據(jù) printf("0x%02x, 0x%02x, 0x%04x\r\n", inputBuff->DO_1, inputBuff->AO_1, inputBuff->AO_2); outputBuff->DI_1 = inputBuff->DO_1; outputBuff->AI_1 = inputBuff->AO_1; outputBuff->AI_2 = inputBuff->AO_2; /*********************************************************/ //將數(shù)據(jù)添加到PDO的發(fā)送隊列中 if (EcatPIOutputQueuePush(hHandle, false, 100)){ _ERR_("PI push error."); break; } }}

第八步,釋放句柄。

EXIT_IF_FAIL(EcatClose(hHandle));

完整的ecat_api_io_test.cpp文件。

#include #include //用于sleep#include //用于sleep#include "pci_errno.h"#include "pci_zecm.h"#include "pci_dbg.h"
//過程數(shù)據(jù),寫入從站的數(shù)據(jù)格式typedef struct{ uint8_t DI_1; uint8_t AI_1; uint16_t AI_2;}PDO_OUTPUTS_T;
//過程數(shù)據(jù),從站返回的數(shù)據(jù)格式typedef struct{ uint8_t DO_1; uint8_t AO_1; uint16_t AO_2}PDO_INPUTS_T;
int32_t testDemo(int alias, int channel, const char* fileName){ int32_t result = 0; char buff[256]; ECAT_HANDLE hHandle; //初始化hHandle句柄 EXIT_IF_FAIL(EcatOpen(&hHandle, BOARD_ALIAS(buff, alias), channel)); //啟動主站 EXIT_IF_FAIL(EcatBusRun(hHandle, fileName)); //將狀態(tài)切換為8(Operational) EXIT_IF_FAIL(EcatRequestMasterState(hHandle, EcatStateO));
//等待主站切換狀態(tài) uint8_t query = EcatStateNotSet; do{ EXIT_IF_FAIL(EcatGetMasterState(hHandle, &query)); //輸出當(dāng)前狀態(tài) _DBG_("request_state=%d, query_state=%d", EcatStateO, query); if (query == EcatStateO){ break;; } std::sleep_for(std::seconds(1)); }while(1);
PDO_OUTPUTS_T *outputBuff; PDO_INPUTS_T *inputBuff; //將指針inputBuff,outputBuff分別指向本地緩存的空間 EXIT_IF_FAIL(EcatPINMap(hHandle, PI_AREA_LOCAL_INPUT, (void**)&inputBuff)); EXIT_IF_FAIL(EcatPINMap(hHandle, PI_AREA_LOCAL_OUTPUT, (void**)&outputBuff));
//向發(fā)送隊列中添加空數(shù)據(jù),添加空數(shù)據(jù)的數(shù)量取決于PC系統(tǒng)抖動的程度,抖動越小,添加的空數(shù)據(jù)越少,控制指令的滯后性越小 for(auto i = 0; i < 2; i++){ EcatPIOutputQueuePush(hHandle, false, 100); } //使能過程數(shù)據(jù)PDO通信 EXIT_IF_FAIL(EcatPIEnable(hHandle));
bool loopFlag = true; while(loopFlag){ //阻塞式等待PDO數(shù)據(jù) if (!EcatPIInputQueuePop(hHandle, false, 100)){ /*********************************************************/ //修改過程數(shù)據(jù) printf("0x%02x, 0x%02x, 0x%04x\r\n", inputBuff->DO_1,inputBuff->AO_1, inputBuff->AO_2); outputBuff->DI_1 = inputBuff->DO_1; outputBuff->AI_1 = inputBuff->AO_1; outputBuff->AI_2 = inputBuff->AO_2; /*********************************************************/ //將數(shù)據(jù)添加到PDO的發(fā)送隊列中 if (EcatPIOutputQueuePush(hHandle, false, 100)){ _ERR_("PI push error."); break; } } }
//釋放句柄 EXIT_IF_FAIL(EcatClose(hHandle)); return result;}
int main(int argc, char* argv[]){ ECAT_HANDLE hHandle; char buff[256]; uint32_t channel = 0, alias = 0; std::string eniFile; if (argc != 4){ std::cout << "usage: " << argv[0] << " encoder_id channel eni.xml" << std::endl; ? ? ? ?return 1; ? ?} ? ?alias = atoi(argv[1]); ? ?channel = atoi(argv[2]); ? ?eniFile = argv[3]; ? ?if (channel > 1){ channel = 1; } testDemo(alias, channel, eniFile.c_str()); return 0;}

編譯

0e191078-1964-11ef-bebc-92fbcf53809c.png

運行測試

0e3396b4-1964-11ef-bebc-92fbcf53809c.png

輸出,程序?qū)⒊掷m(xù)打印從站的輸入狀態(tài)

0e4b7d06-1964-11ef-bebc-92fbcf53809c.png

但真正開發(fā)的時候,建議將打印信息等耗時的操作注釋后再編譯,否則,程序?qū)⒖赡軙驗榇蛴幼骱臅r過長而導(dǎo)致主機無法快速填充pdo數(shù)據(jù),最終將產(chǎn)生控制抖動等問題。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2960

    瀏覽量

    89780
  • PCIe
    +關(guān)注

    關(guān)注

    16

    文章

    1342

    瀏覽量

    85176
  • 通訊卡
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    5926
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    esp32當(dāng)modbus-rtu slave通訊,收不到的響應(yīng)報文是哪里的問題?

    有朋友測試過esp32當(dāng) modbus slave(我拿的esp32當(dāng),用的是RTU模式)嗎? 我用modbus poll軟件測試下來,
    發(fā)表于 06-17 07:39

    Step7 Micro Win v4.0.4.16 最新版下載

    與Modbus的通訊簡單易行。使用Modbus協(xié)議指令,您可以將S7-200組態(tài)作為Modbus RTU
    發(fā)表于 04-25 07:25

    Modbus多問題

    ModbusRTU兩之間如何交互數(shù)據(jù)? 工業(yè)控制中,一般都是主從通訊方式居多,有時也會碰到兩個之間通訊。例如某工作站上位機(
    發(fā)表于 11-24 16:36

    PLC分享

    總站是主控制單元,含有CPU,可以不加CPU,可以作為遠程,用
    發(fā)表于 07-02 08:20

    CAN的功能是什么

    基于 STM32 和 CAN總線的溫度監(jiān)控系統(tǒng)的設(shè)計,通過上位機與下位機的通信,實現(xiàn)對溫度數(shù)據(jù)的監(jiān)控,并經(jīng)初步實驗達到了設(shè)計的要求。1 系統(tǒng)總體方案概述系統(tǒng)總體框圖如圖 1 所示,本系統(tǒng)采用+
    發(fā)表于 08-19 07:47

    PLC具有哪些功能

    PLC具有哪些功能?PLC具有哪些功能?
    發(fā)表于 09-29 07:22

    通過Mbus發(fā)送信息,無法收到信息怎么解決?

    通過Mbus發(fā)送信息,無法收到信息怎么解決?
    發(fā)表于 01-20 06:42

    esp32當(dāng)modbus-rtu slave通訊,收不到的響應(yīng)報文是為何?

    有朋友測試過esp32當(dāng) modbus slave(我拿的esp32當(dāng),用的是RTU模式)嗎? 我用modbus poll軟件測試下來,
    發(fā)表于 02-14 07:11

    lightech mbus完整指令庫

    lightech mbus完整指令庫
    發(fā)表于 10-09 06:20

    西門子STEP7編程軟件創(chuàng)建DP

    在硬件目錄窗口中的PROFIBUS-DP下,選擇“其他現(xiàn)場設(shè)備/兼容的PROFIBUS-DP”文件夾。當(dāng)“舊的”類型文件由新的*.GSD文件代替時,STEP 7將該類型文件移動到此文件夾中。在此文件夾中,可以找到可以用來擴展
    發(fā)表于 03-24 11:38 ?3080次閱讀

    CP5611板卡作為虛擬STEP7的詳細配置方法

    CP5611板卡作為虛擬STEP7的詳細配置方法說明。
    發(fā)表于 04-30 11:40 ?7次下載

    ST IO-Link 通信整體解決方案(上)

    #本文主要介紹工業(yè)系統(tǒng)中用到的STIO-Link通信整體解決方案,包含以下5個方面的內(nèi)容:首先是IO-Link在工業(yè)自動化中的應(yīng)用;第是STIO-Link
    的頭像 發(fā)表于 04-14 10:43 ?1668次閱讀
    ST <b class='flag-5'>IO</b>-Link 通信<b class='flag-5'>主</b><b class='flag-5'>站</b>整體解決方案(上)

    使用DPort-ECT搭建EtherCATstep by step

    為了讓客戶更好地使用ZLG致遠電子的集成式EtherCAT模塊DPort-ECT,本文手把手教你如何使用DPort-ECT模塊和EPC6450-DP評估板快速搭建一個的EtherCAT
    的頭像 發(fā)表于 01-26 08:25 ?1404次閱讀
    使用DPort-ECT搭建EtherCAT<b class='flag-5'>從</b><b class='flag-5'>站</b><b class='flag-5'>step</b> by <b class='flag-5'>step</b>

    使用PCIe EtherCAT通訊控制IOstep by step(一)

    是一款高性能的總線控制卡,專為滿足高實時的工業(yè)控制需求而設(shè)計?;赑CIExpress技術(shù),該卡通過使用實時內(nèi)核+商業(yè)授權(quán)EtherCAT協(xié)議棧的方式,實現(xiàn)了高達
    的頭像 發(fā)表于 05-21 08:24 ?1138次閱讀
    使用<b class='flag-5'>PCIe</b> EtherCAT通訊<b class='flag-5'>卡</b><b class='flag-5'>控制</b><b class='flag-5'>IO</b><b class='flag-5'>從</b><b class='flag-5'>站</b><b class='flag-5'>step</b> by <b class='flag-5'>step</b>(一)

    新手必看!搞清楚Modbus,讓你成為通信達人

    在MODBUS網(wǎng)絡(luò)中,設(shè)備可以分為兩種角色:(Master)和(Slave)。通常是
    的頭像 發(fā)表于 12-16 16:41 ?6797次閱讀
    新手必看!搞清楚Modbus<b class='flag-5'>主</b><b class='flag-5'>站</b>和<b class='flag-5'>從</b><b class='flag-5'>站</b>,讓你成為通信達人