0%

输入继电器(X)

用于接收外部的开关量信号,用X表示。

地址分配原则

在基本单元中,以八进制形式表示,例如X0-X7,X10-X17。
在扩展单元中,第一路扩展从X100开始,第二路从X200开始,以此类推。

输出继电器(Y)

用于驱动PLC外部负载的接口,用Y表示。

地址分配原则

在基本单元中,以八进制形式表示,例如Y0-Y7,Y10-Y17。
在扩展单元中,第一路扩展从Y100开始,第二路从Y200开始,以此类推。

辅助继电器(M)

PLC内部的继电器,用M表示。
注意⚠️:辅助继电器有断电保持功能。

地址分配

按照十进制分配地址,例如M0-M9,M10-M19。

状态继电器(S)

步进梯形图使用的继电器,用S表示。
按十进制分配地址。
注意:不作为工序号使用时,与辅助继电器一样,可作为普通的触点/线圈进行编程。另外,可作为信号报警器,用于外部故障。

定时器(T)

达到设定值的时候,输出触点动作。

地址分配

在基本单元中,按照十进制数分配定时器的地址,又根据时钟脉冲、累计与否将地址划分为几块区域。

时间脉冲

定时器的时钟脉冲有1ms、10ms、100ms三种规格,若选用10ms的定时器,则将对10ms的时间脉冲进行加法计算。

累计/不累计

定时器分为累计与不累计两种模式。
累计定时器,定时器线圈的驱动输入断开,仍保持当前值,等驱动输入再次导通时继续累计动作。
而不累计定时器,输入驱动断开就清零。

计数器(C)

内部计数用(一般使用或停电保持)

  • 16位计数器:增计数用,计数范围1~32,767
  • 32位计数器:增计数用,计数范围1~2,147,483,647
    这些计数器供PLC的内部信号使用,其响应速度为一个扫描周期或以上。

高速计数用(停电保持用)

32位计数器:增/减计数用,计数范围-2,147,483,648~+2,147,483,647(单相递增计数,单相增/减计数,AB相计数)分配给特定的输入点。
速计数可以进行频率80kHz以下的计数,而与可编程控制器的扫描周期无关。
地址分配:按十进制编址。

数据寄存器(D)

供存储数据用的软元件,以符号D表示。

地址分配

XC系列PLC的数据寄存器都是16位的(最高位为符号位),将两个寄存器组合可以进行32位(最高位为符号位)的数据处理。
数据寄存器以十进制编址。

注意⚠️:跟其他软元件一样,数据寄存器也有供一般使用和停电保持。

内部扩展寄存器(ED)

用于存储数据。
以十进制进行编址。

注意⚠️⚠️⚠️:该存储区出厂默认都为停电保持使用,其功能主要用于数据的存储,只适合 MOV,BMOV,FMOV 等数据传送的指令。

题目:一个偶数总能表示为两个素数之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
int Is_Prime_Number(int input)//计算Cal_Prime传过来的值是不是素数,是返回0,不是返回1
{
    int i;
    for (i=2; i<input; i++)
    {
        if (input%i==0)
        {
            return 1;
        }
    }
    return 0;
}
void Cal_Prime(int input)
{
    int i = 0;
    int j = 0;
    for (i=2; i<input; i++)//素数最小都是2,从2开始枚举
    {
        j = input - i;//i和j的和就是input
        int a = Is_Prime_Number(i);//看看i是不是素数
        int b = Is_Prime_Number(j);//看看j是不是素数
        if (a!=1 && b!=1)//如果都是素数
        {
            printf("%d + %d = %d",i,j,input);
            break;
        }
    }
}
int main()
{
    int input = 0;
    printf("请输入一个偶数:->");
    scanf("%d",&input);
    Cal_Prime(input);
    return 0;
}

题目:八进制转换为十进制

例如,八进制数1507转换为十进制数的计算过程如下:‌
个位‌:7乘以8的0次方,即7 * 8^0 = 7。
十位‌:0乘以8的1次方,即0 * 8^1 = 0。
‌百位‌:5乘以8的2次方,即5 * 8^2 = 320。
‌千位‌:1乘以8的3次方,即1 * 8^3 = 512。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
int Cal_Decimal(int input)
{
    int sum = 0;
    while (input!=0)
    {
        int temp = input;
        if (temp < 10)//十进制的数字除到了10以下,直接加上这个数字
        {
            sum = sum + temp;
            break;
        }
        int capacity = 0;//数字的位数
        int temp_capacity;//临时变量-数字的位数
        int a = 10;//用于计算最高位的值
        int i = 0;
        int j = 0;
        int x = 8;//从高位往低位得到各位的数字
        while (temp != 0)//先计算位数
        {
            temp = temp / 10;
            capacity++;
        }
        capacity = capacity - 1;
        temp_capacity = capacity;
        temp = input;
        while (temp_capacity != 0)//获得现在最高位的数字
        {
            temp = temp / 10;
            temp_capacity--;
        }
        j = temp;
        temp_capacity = capacity;
        while (temp_capacity > 1)//计算乘以8的次方数
        {
            x = x * 8;
            temp_capacity--;
        }
        while (capacity >1) //减去最大的一位
        {
            a = a * 10;
            capacity--;
        }
        a = a * j;
        i = x * j;
        input = input - a;
        sum = sum + i;
    }
    return sum;
}
int main() {
    int input;
    int output;
    printf("请输入一个数字:->");
    scanf("%d",&input);
    output = Cal_Decimal(input);
    printf("%d",output);
    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main (void)
{
    char s[20] = "1507";
    int i = 0;
    int n = 0;
    while(s[i]!='\0')
    {
        n = n * 8 + s[i] - '0';
        i++;
    }
    printf("%d",n);
    return 0;
}

题目:809*?? = 800*??+9*??其中??代表的两位数,
809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main()
{
    int a;
    for (a=10; a<100; a++)
    {
        if (809*a >= 1000 && 809*a < 10000 && 8*a >=10 && 8*a < 100 && 9*a >= 100 && 9*a <1000) {
            printf("%d\n",a);
            printf("809*%d = %d\n",a,809*a);
        }
    }
    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <string.h>
void Swap(char* str1,char* str2)
{
    char temp[20];
    strcpy(temp, str1);
    strcpy(str1, str2);
    strcpy(str2, temp);
}
int main()
{
    char ch1[20];
    char ch2[20];
    char ch3[20];
    printf("请输入三个字符串:->\n");
    fgets(ch1, sizeof(ch1), stdin);
    ch1[strcspn(ch1, "\n")] = '\0';
    fgets(ch2, sizeof(ch2), stdin);
    ch2[strcspn(ch2, "\n")] = '\0';
    fgets(ch3, sizeof(ch3), stdin);
    ch3[strcspn(ch3, "\n")] = '\0';
    if (strcmp(ch1, ch2)>0) {
        Swap(ch1, ch2);
    }
    if (strcmp(ch2, ch3)>0) {
        Swap(ch2, ch3);
    }
    if (strcmp(ch1, ch2)>0) {
        Swap(ch1, ch2);
    }
    printf("%s\n%s\n%s\n",ch1,ch2,ch3);
    return 0;
}

题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n。
当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)。

指针函数:本质是一个函数,不过它的返回值是一个指针。
函数指针:本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
float Odd(int n)//求偶数的函数
{
    float i = 2;
    float sum = 0.0;
    while (i <= n)
    {
        sum = sum + 1/i;
        i = i + 2;
    }
    return sum;
}
float Even(int n)//求奇数的函数
{
    float i = 1;
    float sum = 0.0;
    while (i <= n)
    {
        sum = sum + 1/i;
        i = i + 2;
    }
    return sum;
}
int main() {
    int input = 0;
    printf("请输入一个数字:->");
    scanf("%d",&input);
    float Odd(int input);//声明这两个函数
    float Even(int input);
    float (*p)(int);
    if (input % 2 == 0)
    {
        p = Odd;
    }
    else
    {
        p = Even;
    }
    float result = p(input);
    printf("%lf",result);
    return 0;
}

题目:输入一个整数,并将其反转后输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main()
{
    int input;
    int m = 0;
    int k = 0;
    scanf("%d",&input);
    while (input != 0) {
        k = input % 10;
        m = m * 10 + k;
        input = input / 10;
    }
    printf("%d",m);
    return 0;
}

题目:编写input()和output()函数输入和输出学生的数据记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
struct Student//先定义一个学生结构体
{
    char name[20];
    int age;
    char sex[10];
    char Phone[20];
};
struct Student S[1000];//新建一个结构体数组
int count = 0;//计数
void input()
{
    struct Student S1;
    printf("输入名字:->");
    scanf("%s",S1.name);
    printf("输入年龄:->");
    scanf("%d",&S1.age);
    printf("输入性别:->");
    scanf("%s",S1.sex);
    printf("输入电话:->");
    scanf("%s",S1.Phone);
    S[count] = S1;
    count++;
}
void output()
{
    int i;
    for (i=0; i<count; i++)
    {
        printf("name:%s age:%d sex:%s phone:%s\n",S[i].name,S[i].age,S[i].sex,S[i].Phone);
    }
}
int main() {
    int i = 0;
    do {
        printf("1.输入数据 2.输出数据 0.退出:->");
        scanf("%d",&i);
        switch (i) {
            case 1:
                input();
                break;
            case 2:
                output();
            default:
                break;
        }
    } while (i);
    return 0;
}

题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int Char_Length(char* ch)
{
    int i = 0;
    while (ch[i] != '\0')
    {
        i++;
    }
    return i;
}
int main()
{
    char ch[] = "abcdefghijklmnopqrstuvwxyz";
    int ret = Char_Length(ch);
    printf("字符串的长度是:%d",ret);
    return 0;
}

题目:有n个人围成一圈,顺序排号。
从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
int Cal_Josephus(int input,int* arr)
{
    int i = 0;
    int j = 0;
    int stay = input;
    int ret = 1;
    while (stay>1)//当现在留下的人数大于1的时候,一直循环
    {
        for (i=0; i<input; i++)
        {
            if (arr[i] == 1)
            {
                j++;
            }
            if (j==3)
            {
                arr[i] = 0;
                j = 0;
                stay--;
            }
        }
    }
    i = 0;
    while (arr[i] != 1)
    {
        ret++;
        i++;
    }
    return ret;
}
int main(int argc, const char * argv[]) {
    int input;
    scanf("%d",&input);
    int arr[input];
    int x;
    for (x=0; x<input; x++)//先把整个数组都赋值1,代表现在留下
    {
        arr[x] = 1;
    }
    int ret = Cal_Josephus(input,arr);
    printf("留下的是第%d个人",ret);
    return 0;
}