搜索
bottom↓
回复: 25

求信捷PLC C语言编程实例?

[复制链接]

出0入0汤圆

发表于 2017-8-10 09:05:32 | 显示全部楼层 |阅读模式
哪位大神有信捷PLC的C语言编程实例啊,或者麻烦告知一下方法!

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入10汤圆

发表于 2017-8-10 10:26:35 来自手机 | 显示全部楼层
手册上都有啊

出0入0汤圆

 楼主| 发表于 2017-8-10 15:47:57 | 显示全部楼层

我是想按照单片机的C语言编程这样使用,直接控制输出点的信号,手册上的都是一些常规的加减乘除的运算!

出0入0汤圆

发表于 2017-8-10 21:16:23 | 显示全部楼层
注释不知道怎么成乱码了,
  1. /*************************************************************************
  2.    FunctionBlockName:  COMM_MANA
  3.    Version:            1.0.0
  4.    Author:             µ¥ÅàÅà spp-sz@163.com
  5.    UpdateTime:         2013/10/12 15:16:58
  6.    Comment:
  7.                         ¹ÜÀíÔ¶³ÌÄ£¿éµÄ Modbus ͨѶ
  8.                         ±¾º¯ÊýÓÉ 10ms ʱÖÓÇý¶¯
  9. **************************************************************************/


  10. // Öмä¼ÌµçÆ÷ M ¶¨Òå ʹÓà B[name] ÒýÓÃ
  11. // ¼Ä´æÆ÷ D ¶¨Òå  16λʹÓà W[name] ÒýÓ㬠32λʹÓà DW[name] ÒýÓÃ, ¸¡µãʹÓà FW[name] ÒýÓÃ

  12. /* Private typedef -----------------------------------------------------------*/
  13. // BOOL;                //²¼¶ûÁ¿
  14. // INT8U;            //8λÎÞ·ûºÅÕûÊý
  15. // INT8S;            //8λÓзûºÅÕûÊý
  16. // INT16U            //16λÎÞ·ûºÅÕûÊý
  17. // INT16S            //16λÓзûºÅÕûÊý
  18. // INT32U            //32λÎÞ·ûºÅÕûÊý
  19. // INT32S            //32λÓзûºÅÕûÊý
  20. // FP32;            //µ¥¾«¶È¸¡µã
  21. // FP64;            //Ë«¾«¶È¸¡µã

  22. // Ô¤¶¨ÒåµÄºê£º
  23. // #define                        true                1
  24. // #define               false           0
  25. // #define               TRUE                  1
  26. // #define               FALSE           0

  27. /*!< Signed integer types  */
  28. typedef         INT8S             int8_t;
  29. typedef         INT16S            int16_t;
  30. typedef                INT32S             int32_t;

  31. /*!< Unsigned integer types  */
  32. typedef         INT8U             uint8_t;
  33. typedef         INT16U            uint16_t;
  34. typedef         INT32U             uint32_t;

  35. /* Private define ------------------------------------------------------------*/

  36. #define         PowerUpDelayTime_K                                        300        // ÉϵçÑÓʱʱ¼ä 3s = n * 10ms

  37. #define         PollIntervalTime_K                                        90        // ÂÖѯËùÓÐÔ¶³ÌÉ豸ºóÖØпªÆôÂÖѯµÄ¼ä¸ôʱ¼ä 900ms = n * 10ms

  38. #define         MaxParameterSetLength                                30        // ×î´óÖ§³ÖµÄͨÐŲÎÊý¼¯ºÏÊýÁ¿

  39. #define         ParameterSlaveID                                        0        // ²ÎÊý¼¯ºÏ Modbus ´Ó»úÕ¾ºÅ
  40. #define         ParameterCommandType                                1        // ²ÎÊý¼¯ºÏ Modbus ͨÐÅÃüÁîÀàÐÍ
  41. #define         ParameterSlaveStartAddress                        2        // ²ÎÊý¼¯ºÏ Modbus ´Ó»úÊý¾ÝÆðʼµØÖ·
  42. #define         ParameterSlaveDataLength                        3        // ²ÎÊý¼¯ºÏ Modbus ´Ó»úÊý¾Ý³¤¶È
  43. #define         ParameterWordDataBufferAddress                4        // ²ÎÊý¼¯ºÏ Modbus ±¾µØÆðʼµØÖ·
  44. #define         ParameterSlaveIDErrorCountAddress        5        // ²ÎÊý¼¯ºÏ Modbus ±¾µØ¶ÔÓ¦Õ¾ºÅµÄ´íÎó¼ÆÊýÆ÷µØÖ·

  45. // PLC ÄÚ²¿×ÊÔ´Æ«ÒÆÁ¿ºê¶¨Òå-ÇëÎð¸ü¸Ä

  46. // Öмä¼ÌµçÆ÷ M ¶¨Òå
  47. #define         TransmissionStart                                        900                // Modbus ͨÐÅÆô¶¯
  48. #define         TransmissionErrorEnd                                901                // ´®¿Ú2ͨѶ ´íÎó½áÊø ÐźÅ
  49. #define         TransmissionSuccessEnd                                  902                // ´®¿Ú2ͨѶ Õý³£½áÊø ÐźÅ
  50. #define         ResetTransmissionEndMark                          903                // ´®¿Ú2ͨѶ ¸´Î»Í¨ÐűêÖ¾

  51. // ¼Ä´æÆ÷ D ¶¨Òå
  52. #define         CommandType                                                        900                // Modbus ͨÐÅÃüÁîÀàÐÍ
  53. #define         SlaveID                                                                901                // Modbus ´Ó»úÕ¾ºÅ
  54. #define         SlaveStartAddress                                        902                // Modbus ´Ó»úÊý¾ÝÆðʼµØÖ·
  55. #define         SlaveDataLength                                                903                // Modbus ´Ó»úÊý¾Ý³¤¶È
  56. #define         WordDataBufferAddress                                904                // Modbus ±¾µØÆðʼµØÖ·
  57. #define         SlaveIDErrorCountAddress                        905                // Modbus ±¾µØ¶ÔÓ¦Õ¾ºÅµÄ´íÎó¼ÆÊýÆ÷µØÖ·

  58. #define         PollAllTimeConsuming                                909                // ÂÖѯËùÓÐÔ¶³ÌÉ豸ÏûºÄµÄ×Üʱ¼ä ms (ÓÃÓÚÂÖѯ¼ä¸ôÉ趨ֵ²Î¿¼ÓÃ)

  59. #define         ParameterBaseAddress                                2000        // Ô¶³ÌÉ豸 Modbus ͨѶ²ÎÊý¼¯ºÏ»ùÖ·

  60. /* Private macro -------------------------------------------------------------*/
  61. /* Private variables ---------------------------------------------------------*/
  62. /* Private function prototypes -----------------------------------------------*/
  63. int16_t find_next_parameter_set( uint16_t set_offset, WORD W , BIT B );

  64. /* Private functions ---------------------------------------------------------*/
  65. /**
  66.   * @brief  None
  67.   * @param  None
  68.   * @retval None
  69.   */
  70. void COMM_MANA( WORD W , BIT B ){

  71.         static BOOL                 reception_waiting = false;
  72.         static uint8_t                 poll_interval_time_count = 0;
  73.         static uint16_t         powerup_delay_time_count = 0;
  74.         static uint16_t         parameter_set_offset = 0;
  75.         static uint16_t         poll_all_time_consuming_count = 0;

  76.         uint16_t offset_address = 0;

  77.         // ÅжÏÊÇ·ñΪÉϵçºóµÄÊ×´ÎÊý¾Ý´«Êä-ÑÓʱ3ÃëºóÔÙ¿ªÊ¼
  78.         if(powerup_delay_time_count < PowerUpDelayTime_K){
  79.                 if(++powerup_delay_time_count < PowerUpDelayTime_K) return;
  80.                 poll_interval_time_count = 0;
  81.                 parameter_set_offset = 0;
  82.                 reception_waiting = false;
  83.         }

  84.         // µÈ´ýÂÖѯ¼ä¸ôʱ¼äµ½
  85.         if(poll_interval_time_count > 0){       
  86.                 poll_interval_time_count--;
  87.                 return;       
  88.         }
  89.        
  90.         if(poll_all_time_consuming_count > 0)poll_all_time_consuming_count++;
  91.        
  92.         // Èç¹ûΪµÈ´ý½ÓÊÕ״̬ -ÅжϽÓÊÕÊÇ·ñÍê³É
  93.         if(reception_waiting){

  94.                 // Åжϴ«ÊäÊÇ·ñÍê³É
  95.                 if((B[TransmissionErrorEnd] == 0) && (B[TransmissionSuccessEnd] == 0)){
  96.                         return;
  97.                 }

  98.                 // Èç¹ûÓдíÎó´«Êä-¶ÔÓ¦µÄ³ö´íµÄÉ豸µÄ´íÎó¼ÆÊýÔö¼Ó
  99.                 if(B[TransmissionErrorEnd]){
  100.                         if(W[W[SlaveIDErrorCountAddress]] < 9999) W[W[SlaveIDErrorCountAddress]]++;
  101.                 }

  102.                 // Èç¹û³É¹¦½áÊø-Çå³ý¶ÔÓ¦µÄÉ豸µÄ´íÎó¼ÆÊý
  103.                 // Èç¹û³É¹¦½áÊø-Çå³ý¶ÔÓ¦µÄÉ豸µÄ´íÎó¼ÆÊý
  104.                 if(B[TransmissionSuccessEnd]){
  105.                         W[W[SlaveIDErrorCountAddress]] = 0;
  106.                 }
  107.                 B[ResetTransmissionEndMark] = 1;
  108.         }

  109.         // ²éÕÒÏÂÒ»¸öÓÐЧ¼¯ºÏ£¬Èç¹û·µ»Ø -1 ¼¯ºÏ²éÕÒÍê±Ï
  110.         parameter_set_offset = find_next_parameter_set(parameter_set_offset, W, B);

  111.         if(parameter_set_offset == -1) {
  112.                 poll_interval_time_count = PollIntervalTime_K; // Ò»ÂÖͨѶ½áÊøÆô¶¯¼ä¸ô¶¨Ê±
  113.                
  114.                 parameter_set_offset = 0;
  115.                 reception_waiting = false;
  116.                
  117.                 W[PollAllTimeConsuming] = poll_all_time_consuming_count * 10;
  118.                 poll_all_time_consuming_count = 0;
  119.                 return;
  120.         }
  121.        
  122.         // Æ«ÒÆÁ¿Îª 0 ˵Ã÷½«´ÓµÚÒ»¿ªÊ¼ÂÖѯ-Æô¶¯ÂÖѯÖÜÆÚ¼Æʱ
  123.         if(parameter_set_offset == 0){
  124.                 poll_all_time_consuming_count = 1;
  125.         }
  126.        
  127.         // È¡ÕÒµ½µÄ¼¯ºÏµÄÊý¾Ý
  128.         offset_address         = parameter_set_offset * 10 + ParameterBaseAddress;

  129.         W[CommandType]                                 = W[offset_address + ParameterCommandType];
  130.         W[SlaveID]                                         = W[offset_address + ParameterSlaveID];
  131.         W[SlaveStartAddress]                 = W[offset_address + ParameterSlaveStartAddress];
  132.         W[SlaveDataLength]                         = W[offset_address + ParameterSlaveDataLength];
  133.         W[WordDataBufferAddress]         = W[offset_address + ParameterWordDataBufferAddress];
  134.         W[SlaveIDErrorCountAddress] = W[offset_address + ParameterSlaveIDErrorCountAddress];

  135.         parameter_set_offset++;
  136.         reception_waiting = true;
  137.         B[TransmissionStart] = 1; // Æô¶¯´«Êä
  138. }

  139. /**
  140.   * @brief  None
  141.   * @param  None
  142.   * @retval None
  143.   */
  144. int16_t find_next_parameter_set( uint16_t set_offset, WORD W , BIT B ){

  145.         int16_t i = (int16_t)set_offset; // Ö¸ÏòÏÂÒ»¸ö¼¯ºÏ

  146.         for(i; i < MaxParameterSetLength; i++){

  147.                 if(W[(i * 10 + ParameterBaseAddress)] != 0) return i;
  148.         }

  149.         return (-1);
  150. }



复制代码

出0入0汤圆

 楼主| 发表于 2017-8-11 16:58:54 | 显示全部楼层

这里的代码是常规的应用吧?

出0入0汤圆

 楼主| 发表于 2017-8-11 16:59:39 | 显示全部楼层

M[0]代表什么意思?
Y[0]代表什么意思?

出0入0汤圆

 楼主| 发表于 2017-8-11 17:00:28 | 显示全部楼层
ntkz 发表于 2017-8-10 21:16
注释不知道怎么成乱码了,

看起来大部分都是数据运算啊?

出0入0汤圆

发表于 2017-8-11 18:37:55 来自手机 | 显示全部楼层
用什么编译器??MDK?

出0入8汤圆

发表于 2017-8-11 20:48:13 | 显示全部楼层

#define SysRegAddr_X_Y_HS_HC_HT_HCD_HTD_HD_HM_S_C_T_CD_TD_D_M_SM_SD_SFD
请问一下,这个宏定义是什么意思,谢谢?

出0入8汤圆

发表于 2017-8-11 22:28:24 | 显示全部楼层
jswd0810 发表于 2017-8-11 21:35
指令手册的内容:
在PLC的C语言中,如果需要使用输入(X)以及输出(Y),则需要在里面加入宏定义“#defi ...

谢谢,我一直都用XC系列,没有用过XD系列,XC系统不能操作输出口

出0入0汤圆

 楼主| 发表于 2017-8-12 19:50:04 | 显示全部楼层
jswd0810 发表于 2017-8-11 21:35
指令手册的内容:
在PLC的C语言中,如果需要使用输入(X)以及输出(Y),则需要在里面加入宏定义“#defi ...

触摸屏中设置修改参数,可以与C语言结合起来吗?

出0入0汤圆

 楼主| 发表于 2017-8-12 19:50:45 | 显示全部楼层
jswd0810 发表于 2017-8-11 21:37
M[0]是PLC内部的中间继电器M0,Y[0]是PLC输出口Y0

你真是个大神啊!赶紧写个程序尝试一下!多谢多谢!

出0入0汤圆

 楼主| 发表于 2017-8-12 19:54:09 | 显示全部楼层
jswd0810 发表于 2017-8-11 22:41
抱歉,XC的我没有用过,不知道能不能操作

大神,给你发私信了,

出0入0汤圆

 楼主| 发表于 2017-8-14 18:33:33 | 显示全部楼层
jswd0810 发表于 2017-8-13 11:33
C语言主要还是用于数据处理

那就是没有可以使用的脉冲控制电机的函数了吧?

出0入4汤圆

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

本版积分规则

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

GMT+8, 2024-4-27 07:33

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

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