搜索
bottom↓
回复: 5

各位仿三菱PLC的大侠,哪位有做SPD这条指令的吗?》??

[复制链接]

出0入0汤圆

发表于 2010-9-11 08:18:20 | 显示全部楼层 |阅读模式
各位仿三菱PLC的大侠,哪位有做SPD这条指令的吗?》??

出0入0汤圆

 楼主| 发表于 2010-9-11 09:41:11 | 显示全部楼层
|      X001                                            |
|------| |---------------------------[SPD X000 K100 D0]|
|                                                      |

指令格式如上。。。。  用单片机 ARM怎样实现呢???有点思路,但不清晰。。。。

出0入0汤圆

发表于 2010-9-17 12:49:14 | 显示全部楼层
莫非这位就是明君的朋友?

出0入0汤圆

发表于 2010-9-17 12:50:56 | 显示全部楼层
u32 App56_SPD(u32 Address)   //脉冲密度(P型指令)
{
  u16 S1_16bit,S2_16bit/*,D_16bit*/;
  //u32 S1_32bit,S2_32bit,D_32bit;

  u8 b_exe,b_exe_last;

  b_exe=IF_execute();
  b_exe_last=Get_lastState(Address); //取last位
  
  if(b_exe)
  {
    S1_16bit=Get_u16_data(Address+2,0);     //取得Xn标号
    S2_16bit=Get_u16_data(Address+6,0);     //取得定时时间(ms)
    if(b_exe_last)  //初始化已经完成,计数处理中
    {
      //D_16bit=Get_u16_data(Address+10,2);   //取得定时时间(ms)
      if(*(u16*)(SPD_X0+(S1_16bit-0x400)*4)==0) //定时时间到
      {
        Put_u16_data(Address+10,0,1);           //扫描频率备份清零      
        Put_u16_data(Address+10,*(u16*)(SPD_X0_Lock+(S1_16bit-0x400)*4),0); //扫描频率取出
        *(u16*)(X_CNT_BASE+(S1_16bit-0x400)*4)=0;
        *(u16*)(SPD_X0+(S1_16bit-0x400)*4)=S2_16bit;
      }
      else
      {
        Put_u16_data(Address+10,*(u16*)(X_CNT_BASE+(S1_16bit-0x400)*4),1); //扫描频率变动
        Put_u16_data(Address+10,*(u16*)(SPD_X0+(S1_16bit-0x400)*4),2);  //剩余定时时间修正
      }
    }
    else  //初始化,判断是否执行
    {
      if((*(u32*)(X0_En+(S1_16bit-0x400)*4))==0)    //高速输入还未置上
      {
        (*(u32*)(X0_En+(S1_16bit-0x400)*4))=1;      //置互斥标记,
        Put_u16_data(Address+10,S2_16bit,2);        //剩余时间放在 D+2 中
        // 设置IO口为外部中断输入计数,清除计数值
        Hign_Speed_Port_init(S1_16bit-0x400,4,1);   //软件计数模式
        *(u16*)(SPD_X0+(S1_16bit-0x400)*4)=S2_16bit; //填时间
        *(u32*)(X_CNT_BASE+(S1_16bit-0x400)*4)=0;
        Put_u16_data(Address+10,0,1);
      }
      else //高速输入已被占用,退出
      {
        return (Address+2*7);
      }
    }
  }
  else  //触电下降沿
  {
    if(b_exe_last)  //释放资源
    {
      *(u16*)(SPD_X0+(S1_16bit-0x400)*4)=0;       //清零时间
      Hign_Speed_Port_init(S1_16bit-0x400,4,0);
    }
  }
  Set_lastState(Address,b_exe);   //b_exe => last_bit
  return (Address+2*7);
}

出0入0汤圆

发表于 2010-9-17 12:52:18 | 显示全部楼层
1ms中断当中添加的处理
    //SPD指令检查
    for(loop=0;loop<8;loop++)  
    {
      if(*(u16*)(SPD_X0+loop*4))  // SPD定时时间到
      {
        *(u16*)(SPD_X0+loop*4)-=1;
        if(*(u16*)(SPD_X0+loop*4)==0)
        {
          *(u16*)(SPD_X0_Lock+loop*4)=*(u16*)(X_CNT_BASE+loop*4); //锁存高速输入                        
        }
      }
    }

出0入0汤圆

发表于 2010-9-17 12:53:32 | 显示全部楼层
x0-x7的计数我是用外部中断来进行计数的

cpu选用的是stm32
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 15:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表