偶初学的时候写的,同给初学者参考

很多人,无论做什么事情,刚起步当然难。

写了一个相当于Hello World的NC代码,给刚接触的初学者。

//以下是一个灯开关NC程序的示例,相当于Hello World吧,我一向喜欢用按键和灯来做第一个程序。

#pragma num_alias_table_entries 10
#pragma run_unconfigured
#pragma enable_sd_nv_names
#pragma  relaxed_casting_on

//  --- Include files ---
#include <io_types.h>
#include <control.h>
#include <addrdefs.h>
#include <netmgmt.h>
#include <msg_addr.h>
#include <status.h>

extern system void _change_state(int state);

//  --- predefine variable declarations ---
#define STX 0x02        // start of packet
#define ETX 0x00        // end of packet
#define MAX 4 // max queue size
#define BUFF_SIZE 31 //buffer size
#define NM_SEND_TIME 10
#define EDEV_DELAY_TIME 10000
#define unconfigured 0x02
#define config_on_line 0x04
#define config_off_line 0x0c
//--------------------------------
#define ON 1
#define OFF 0
//--------------------------------

// io object declaration (new)-----------
IO_0 output bit ioRelay01 = TRUE;
IO_1 output bit ioRelay02 = TRUE;
IO_2 output bit ioRelay03 = TRUE;
IO_3 output bit ioRelay04 = TRUE;

IO_4 input bit ioButton01;
IO_5 input bit ioButton02;
IO_6 input bit ioButton03;
IO_7 input bit ioButton04;
//-----------------------------------------

//  --- timer declarations ---
mtimer repeating        Nv_ack_timer;
mtimer edev_info_timer;
stimer edev_delay_timer;

//  --- network variable declarations ---
far network input SNVT_str_asc nviHostData;
far network output SNVT_str_asc nvoData;

//  --- function declarations ---
void SelfBind(void);
void CheckDomain(void);

//  --- variable declarations ---
typedef struct queue{
        unsigned char buff[BUFF_SIZE];
}queue;
far queue rcv_que[MAX];


domain_struct new_domain;
//-----------------------------------------------------------------------------------------------
// --- eeprom variable declarations ---
// e-device inforamtion initialize
//-----------------------------------------------------------------------------------------------
// 4ch., use the below data
eeprom unsigned int edev_info[31]={0x02,0x22,0x00,0x04,0x00,0x05,0x00,0x90,0x00,0xBF,
           0x22,0x00,0x05,0x11,0x04,0x30,0x30,0x30,0x30,0x30,
           0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00};
           
// if 3ch., use the below data
//eeprom unsigned int edev_info[31]={0x02,0x22,0x00,0x03,0x00,0x05,0x00,0x90,0x00,0xBF,
//           0x22,0x00,0x05,0x11,0x03,0x30,0x30,0x30,0x30,0x30,
//           0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00};

// if 2ch., use the below data
//eeprom unsigned int edev_info[31]={0x02,0x22,0x00,0x02,0x00,0x05,0x00,0x90,0x00,0xBF,
//           0x22,0x00,0x05,0x11,0x02,0x30,0x30,0x30,0x30,0x30,
//           0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00};

// if 1ch., use the below data
//eeprom unsigned int edev_info[31]={0x02,0x22,0x00,0x01,0x00,0x05,0x00,0x90,0x00,0xBF,
//           0x22,0x00,0x05,0x11,0x01,0x30,0x30,0x30,0x30,0x30,
//           0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00};

//-----------------------------------------------------------------------------------------------

unsigned int sbuff_tmp[BUFF_SIZE];
unsigned int ck_checksum;
unsigned int rear_rptr, front_rptr;
unsigned int f_txOK, f_rxOK;
unsigned int ck_info_ctr;
unsigned int f_uartOK;

/* Light State buffer & flag defince------------------------------------------------------------*/ 
unsigned int light_state[31];  // to save status msg temporarily
unsigned int led_state01,led_state02,led_state03,led_state04; // to save led status, i,e, flag variables
/* ---------------------------------------------------------------------------------------------*/ 


//-----------------------------------------------------------
//
// [1] Initialize Block
//
//-----------------------------------------------------------
when ( reset )
{
 unsigned int i,j;
 ck_info_ctr = 0;
 rear_rptr = 0;
 front_rptr = 0;
// test = 3000;
 f_txOK = 1;
 f_rxOK = 1;
 Nv_ack_timer = 0; // 300ms timer stop
 for( i = 0; i< MAX; i++)
  for( j = 0; j< BUFF_SIZE; j++)  // buffer clear
   rcv_que[i].buff[j] = 0;

/* ---------------------------*/ 
 led_state01 = ON; 
 led_state02 = ON;
 led_state03 = ON;
 led_state04 = ON;
 io_out(ioRelay01,0);  // relay off
 io_out(ioRelay02,0);
 io_out(ioRelay03,0);  
 io_out(ioRelay04,0); 
/* ---------------------------*/ 
 CheckDomain();
}


//-----------------------------------------------------------
//
// [2] Timer Block
//
//-----------------------------------------------------------
when( timer_expires(edev_delay_timer))
{
 (void)service_pin_msg_send(); 
 edev_info_timer = EDEV_DELAY_TIME;
}

when( timer_expires(edev_info_timer))
{
 ck_info_ctr++;
 (void)service_pin_msg_send(); 
 if( ck_info_ctr > 4)
 {
  ck_info_ctr = 0;
  edev_info_timer = 0; 
 }
 else
  edev_info_timer = EDEV_DELAY_TIME;
}

when( timer_expires(Nv_ack_timer))
{
 if(nv_update_succeeds( nvoData ))
 {
  rear_rptr = (rear_rptr + 1) & (MAX-1); // que rcv index increase
  f_txOK = 1;
  Nv_ack_timer = 0;  // 300ms timer stop
 }
 else
 {
  if(nv_update_fails( nvoData ))
  {
   rear_rptr = (rear_rptr + 1) & (MAX-1); // que rcv index increase
   f_txOK = 1;
   Nv_ack_timer = 0; // 300ms timer stop
  }
 }
}

//-----------------------------------------------------------
//
// [3] Receive Block
//
// : save the received PLC packet to buffer and do action according to msg
//-----------------------------------------------------------
when(nv_update_occurs(nviHostData))
{
 unsigned int i;

 if(nviHostData.ascii[5] == 0x10)
 {
  new_domain = *(access_domain(0));
  if(rear_rptr == ((front_rptr + 1)&(MAX-1)))
   rear_rptr = (rear_rptr + 1)&(MAX-1); // data loss
  rcv_que[front_rptr].buff[0] = STX;
  for(i=1; i<4; i++)
   rcv_que[front_rptr].buff[i] = edev_info[i];
  rcv_que[front_rptr].buff[4] = 0; //Opt, PN
  rcv_que[front_rptr].buff[5] = 0x11; //SK,PT
  rcv_que[front_rptr].buff[6] = 0; //MODE

  rcv_que[front_rptr].buff[7] = 0x10; //Version Inform 1.0 version
  if(read_only_data.model_num == 0)
   rcv_que[front_rptr].buff[8] = 0x01; //3150 Model Number
  else if(read_only_data.model_num == 1)
   rcv_que[front_rptr].buff[8] = 0x11; //PL 3150 Model Number
  else if((read_only_data.model_num >=8)&&(read_only_data.model_num <=14))
   rcv_que[front_rptr].buff[8] = 0; // 3120 Model Number
  else if(read_only_data.model_num == 15)
   rcv_que[front_rptr].buff[8] = 0x10; // PL 3120 Model Number
  else
  rcv_que[front_rptr].buff[8] = 0x10; // PL 3120 Model Number
  for(i=0;i<6;i++)
   rcv_que[front_rptr].buff[i+9] = read_only_data.neuron_id[i];
  for(i=0;i<6;i++)
   rcv_que[front_rptr].buff[i+15] = new_domain.id[i];
  rcv_que[front_rptr].buff[21] = new_domain.subnet;
  rcv_que[front_rptr].buff[22] = new_domain.node;
  for(i=23; i<29; i++)
   rcv_que[front_rptr].buff[i] = 0x30; // dummy
  ck_checksum = 0;
  for(i=0; i<29; i++)
   ck_checksum = ck_checksum^rcv_que[front_rptr].buff[i];
  rcv_que[front_rptr].buff[29] = ck_checksum; 
  rcv_que[front_rptr].buff[30] = ETX; 
  front_rptr = (front_rptr + 1)&(MAX-1); // receive que increase
 }
 else
 {
  if( f_uartOK != 0xf0 )
  {
   for( i=0; i < 31; i++ )
    sbuff_tmp[i] = nviHostData.ascii[i]; 

   //--------------------------------------------------------------------------- 
   // PLC Msg process
   // : do action according to msg (for example: command, requset syayus, ...)
   //---------------------------------------------------------------------------    
   if(sbuff_tmp[5]==0x01 && 0x0F)  //is this packet type[PT] "command" ?
   {
    light_state[5]=0x02;
   
    if(sbuff_tmp[7]==0x01)   //Does 1st byte of Data Field mean 'ON'?
    {
     io_out(ioRelay01,0);
     led_state01=ON;
     light_state[7]=0x01;
     for (i=0; i<31; i++)
      nvoData.ascii[i] = light_state[i];
    }
    else if(sbuff_tmp[7]==0x00) //Does 1st byte of Data Field mean 'OFF'?
    {
     io_out(ioRelay01,1);
     led_state01=OFF;
     light_state[7]=0x00;
     for (i=0; i<31; i++)
      nvoData.ascii[i] = light_state[i];
    }
    
    else //添加其他的按键,由网络变量传送的信息
     ;
   }  
    
   else if(sbuff_tmp[7]==0x00)  //is this packet type[PT] "request Status"?
   {
    light_state[5]=0x02;
    nvoData.ascii[i] = light_state[i];
   }
    
   else
    ;
   //--------------------------------------------------------------------
  }
 }
}


//-----------------------------------------------------------
//
// [4] Transmit Block
//
// : save PLC packet to Tx Que
//-----------------------------------------------------------
when((f_txOK == 1)&&(rear_rptr != front_rptr))
{
 unsigned int i;
 for (i=0; i<31; i++)
  nvoData.ascii[i] = rcv_que[rear_rptr].buff[i];
 Nv_ack_timer = 300;  // 300ms timer start
 f_txOK = 0;
}

//-----------------------------------------------------------
//
// [5] Biding Block
//
// : bind and do someting
//-----------------------------------------------------------
when(msg_arrives)
{
 if(msg_in.code == 0x31)
 {
  if(msg_in.data[15] == 0xf0) // Binding Start
   SelfBind();
  else if(msg_in.data[15] == 0x0f) // go_unconfigured 
  {
   _change_state(unconfigured);
   clear_status();
   node_reset();
  }
  else if(msg_in.data[15] == 0x07)
  {
   edev_info_timer = 0; 
   ck_info_ctr = 0;
  }
  else
  ; 
 }
 else
 ;
}

//-----------------------------------------------------------
//
// [6] I/O process Block
//
// : check button and control relays or leds
//-----------------------------------------------------------
when (io_changes(ioButton01) to 0)
{
    // The below codes are just example for our former product.
    // please, customize to your product.
 int i;
 light_state[5]=0x07; // event notification
                      // to set PT field to 0x07

 if(led_state01==ON)
 {  
  io_out(ioRelay01,0);
  led_state01=OFF;
  
  light_state[7]=0x01;
  
  for (i=0; i<31; i++)
   nvoData.ascii[i] = light_state[i];
 }
 else if(led_state01==OFF)
 {
  io_out(ioRelay01,1);
  led_state01=ON;
  
  light_state[7]=0x00;
  
  for (i=0; i<31; i++)
   nvoData.ascii[i] = light_state[i];
 }
 else
 ;
}

when (io_changes(ioButton02) to 0)  //其他按键被直接近下时的动作
{
// insert your code here
}

when (io_changes(ioButton03) to 0)
{
// insert your code here
}

when (io_changes(ioButton04) to 0)
{
// insert your code here
}

//-----------------------------------------------------------
//
// Subroutines
//
//-----------------------------------------------------------
void SelfBind()
{
 unsigned int i;
 address_struct my_address;
 nv_struct my_nv;
 my_address = *(access_address(1)); // set address table 1
 my_address.sn.type = SUBNET_NODE;
 my_address.sn.domain = 0;
 my_address.sn.node = 127; 
 my_address.sn.tx_timer = NM_SEND_TIME;
 my_address.sn.retry = 3;
 my_address.sn.subnet = 1;
 update_address(&my_address, 1);

 my_nv = *(access_nv(1));
 my_nv.nv_selector_hi = 0x00;
 my_nv.nv_selector_lo = 0x7C;
 my_nv.nv_addr_index = 1;
 update_nv(&my_nv, 1);
 if(rear_rptr == ((front_rptr + 1)&(MAX-1)))
  rear_rptr = (rear_rptr + 1)&(MAX-1); // data loss
 for(i=0;i<31;i++)
  rcv_que[front_rptr].buff[i] = edev_info[i];
 front_rptr = (front_rptr + 1)&(MAX-1); // receive que increase
}

void CheckDomain()
{
 unsigned int i;
 
 new_domain = *(access_domain(1));
 new_domain.len = 0;
 for(i=0; i<6; i++) new_domain.id[i] = 0;  
 new_domain.subnet = 0;
 new_domain.node = 0;
 update_domain(&new_domain, 1);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 铠装热电接线图是用于连接铠装热电的电路图,以实现温度测量和监控。铠装热电是一种常用的温度传感器,由两种不同金属导线组成,其接线图可分为两类,即常用的平对接方式和对螺纹方式。 平对接方式的接线图主要包括两根金属导线通过绝缘套管连接的部分,以及与测量设备(如测温仪表)的连接部分。其中,两根金属导线的端子通过一根金属导线连接到测温仪表的接线端子上,实现电信号的传递和温度值的读取。 对螺纹方式的接线图更为复杂,其中包括了金属导线、铠装保护管、绝缘套管和对螺纹连接器等组件。金属导线通过对螺纹连接器与铠装保护管连接,进而通过绝缘套管与测量设备相连。这种连接方式可以保护导线免受外界干扰和机械损伤,提高测量精度和可靠性。 在铠装热电接线图中,还需要注意正确连接金属导线的颜色。通常,热电的导线颜色分别为红色和白色,其中红色导线代表热电的正极端口,而白色导线代表热电的负极端口。正确连接这两根导线非常重要,以确保测温设备正确读取温度值。 综上所述,铠装热电接线图是铠装热电安装和连接的关键参考,以保证温度测量的准确性和可靠性。仔细按照接线图进行连接,可以确保热电信号的传递和温度值的准确读取,为工业生产和实验研究提供准确的温度数据。 ### 回答2: 铠装热电接线图CSdn是一个网上技术社区,主要提供了铠装热电接线图的相关内容和讨论。铠装热电是一种用于测量温度的传感器,由两种不同金属的导线连接组成,在温度变化时会产生微小的电压信号。接线图则是描述如何将热电连接到仪器或测量系统的图表。 在铠装热电接线图CSdn中,你可以找到各种关于接线图的技术文档、疑难解答和实际应用案例。这些资源可以帮助你理解如何正确选择和连接热电,以及如何解决在接线过程中可能遇到的问题。 此外,该网站还提供了与其他技术人员的互动交流平台,您可以在社区中与其他热电用户和技术专家交流经验,互相学习和解答问题。 总之,铠装热电接线图CSdn是一个提供铠装热电接线图相关内容的技术社区,对从初学者到专家的用户都提供了有益的资源和互动交流的平台。 ### 回答3: 铠装热电接线图是指用于热测量的一种温度传感器,常见于工业领域中。 铠装热电接线图CSN中,通常由两个导线组成,分别为热电和补偿导线。热电由两种不同材质的金属丝制成,这两根金属丝的连接点称为热点。热点的温度变化会产生微弱的电动势,通过测量这个电动势的大小,可以确定被测物体的温度。 铠装热电的热电导线一般采用铠装,这种设计可以保护导线免受外界环境的损害,如机械挤压、化学腐蚀等。而补偿导线则通常采用与热电相同或相似材质的导线,用于连接热电与测温仪表之间。补偿导线的作用是将热电热电势的信号传输到测温仪表中,同时对环境温度的影响进行补偿,从而获得准确的温度值。 在铠装热电接线图中,热电是通过一端与被测物体接触,另一端通过热电头连接到补偿导线上。而补偿导线的另一端与测温仪表相连接,使得测温仪表能够读取并显示被测物体的温度数值。 总的来说,铠装热电接线图CSN是一种将热电和补偿导线连接起来的示意图,利用热电的温度敏感性和补偿导线的温度补偿功能,可以实时准确地测量被测物体的温度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值