固高控制卡学习5 –数字 IO
调用 GT_GetDi 指令可以读取限位、驱动报警、原点、通用输入、手轮接口这些数字量输入接口的输入电平状态。其中,手轮接口为 5V 电平输入,其余 IO 为 24V 电平输入。调用 GT_SetDo 指令可以设置伺服使能、报警清除、通用输出这些数字量输出接口的输出电平状态。
调用 GT_GetDiRaw 指令可以读取数字量输入接口的原始电平状态。
GT_GetDiReverseCount 指令用来读取数字量输入的变化次数,当数字量输入由 0 变为 1,或者由 1 变为 0,该次数就会增加一次。
GT_SetDiReverseCount 指令用来设置数字量变化次数计数器的初值。
GT_SetDoBitReverse 指令用来使数字量输出信号输出一个定时的脉冲,例如,假设当前通用数字量输出信号 1 是高电平,当调用指令 GT_SetDoBitReverse(MC_GPO, 1, 0, 100);则该数字量信号将会发出一个 100×250μs=25ms 时间宽度的负脉冲。
| GT_GetDi | 读取数字 IO 输入状态 |
| GT_GetDiRaw | 读取数字 IO 输入状态的原始值 |
| GT_GetDiReverseCount | 读取数字量输入信号的变化次数 |
| GT_SetDiReverseCount | 设置数字量输入信号的变化次数的初值 |
| GT_SetDo | 设置数字 IO 输出状态 |
| GT_SetDoBit | 按位设置数字 IO 输出状态 |
| GT_SetDoBitReverse | 使数字量输出信号输出定时脉冲信号 |
| GT_GetDo | 读取数字 IO 输出状态 |
例程
:
有一个按键连接端子板上通用输入 EXI3 ,常为低电平,按下按键,输入高电平。端子板通用输出 EXO6 上连接一个指示灯,当 EXO6 输出低电平时指示灯亮,输出高电平时指示灯灭。开始指示灯一直灭,用户希望不断读取轴 1 正负限位的数字量输入变化次数,并将结果输出到显示器。在正负限位变化次数都超过 10 次之后归零重新计数,并且使指示灯一直亮起来。用户可以随时按键停止这种检测。
// 打开运动控制器 sRtn = GT_Open(); // 复位运动控制器 sRtn = GT_Reset(); // 初始化变化次数为0 lPosLmtReverseCount = 0; lNegLmtReverseCount = 0; // 读取EXI3输入值 sRtn = GT_GetDi(MC_GPI, &lGpiValue); // 如果为高电平,说明按键正在被按下,则不检测,返回 1 if( lGpiValue& (1<<3)) return 1; // EXO6输出高电平,使指示灯灭 sRtn = GT_SetDo(MC_GPO, 1<<6); // 按键没有被按下,循环。如果EXI3输入值为高电平,即按键按下,则退出循环 while( ! (lGpiValue& (1<<3))) { // 读取正限位输入变化次数 sRtn = GT_GetDiReverseCount( MC_LIMIT_POSITIVE, // 指定数字IO类型是正限位 1, // 指定正限位1 &lPosLmtReverseCount, // 读取的值 1); // 一次读取一个数字量 // 读取负限位输入变化次数 sRtn = GT_GetDiReverseCount( MC_LIMIT_NEGATIVE, // 指定数字IO类型是负限位 1, // 指定负限位1 &lNegLmtReverseCount, // 读取的值 1); //一次读取一个数字量 // 将结果输出到显示器 printf("PosLmtReverseCount = %d\n NegLmtReverseCount = %d\n",lPosLmtReverseCount, lNegLmtReverseCount); // 如果正负限位的输入变化次数都超过10次 if(( lPosLmtReverseCount>= 10) &&( lNegLmtReverseCount>= 10) ) { // 重新归为0 lPosLmtReverseCount = 0; lNegLmtReverseCount = 0; // 设置正限位输入变化次数 sRtn = GT_SetDiReverseCount( MC_LIMIT_POSITIVE, // 指定数字IO类型是正限位 1, // 指定正限位1 &lPosLmtReverseCount, // 读取的值 1); // 一次读取一个轴 // 设置负限位输入变化次数 sRtn = GT_SetDiReverseCount( MC_LIMIT_NEGATIVE, // 指定数字IO类型是负限位 1, // 指定负限位1 &lNegLmtReverseCount, // 读取的值 1); // 一次读取一个轴 // EXO6输出高电平,使指示灯亮 sRtn = GT_SetDoBit( MC_GPO, // 指定数字IO类型是通用输出 7, // 指定第7个通用输出,即EXO6 0); // 输出低电平 } // 不断读取通用输入,已检测EXI3的电平状态 sRtn = GT_GetDi(MC_GPI, &lGpiValue); }
