【factoryio】使用SCL编写 <机械手控制> 程序

news2024/9/23 21:29:21

使用虚拟工厂软件和博图联合仿真来编写【scl】机械手控制程序

文章目录

目录

文章目录

 前言

二、程序编写

1.机械手运行部分

2.启动停止部分

3.急停复位部分

 三、完整代码

总结


 前言

在前面我们一起写过了许多案例控制的编写,在这一章我们一起来编写一下一个仿真机械手程序(用SCL),这是一个大的加工中心其中一部分,完整的是:两个机械手完成进料和放托盘,经过传送带后可以进行升降或者进入仓储部分来存放,这里我们先完成第1个机械手控制部分,它的主要工作是完成取料和放料。


一、控制要求

程序要求: 

1.按下启动按钮,出料,传送带A启动,当S传感器检测到物体时,传送带A停止运行,1s后机械手左转,在左转到位后停1s,吸盘得电0.5s后,机械手下降,当抓取到物体1s后机械手上升,上升到位后延时1s右转,右转到位后1s,机械手下降,下降到位后延时0.5s,吸盘失电,同时机械手上升,当料到位传感器检测到物体时 得电,B传送带运行,运行3s后,同时机械臂左转回到原位,3s时间到后,B传动带停止,机械手进入下一循环,继续取料上料。


2.在程序运行时如果按下停止按钮,程序会在循环完一次后回到原位停止操作,并且可以再次启动运行。

3.在程序运行时如果按下急停按钮,程序动作立即停止,当按下复位按钮后程序才能继续运行,在急停期间其他按钮无效。

factoryio(虚拟工厂)参考图:

 到这里看过控制要求和场景后,大家可以自己试着用SCL编写一下,控制要求是参考前面机械手改进的,大家也可以自己写一下控制要求来编写。




 I/O分配:

 I/O分配一定要在题目要求中找到并判断是输入还是输出,这里我写出来了。下面5个指示灯是代表机械手的个个动作,加不加都可以。

输入输出
名称作用地址名称作用地址
SB1启动I0.0A传送带传送带Q0.0
SB2停止I0.1B传送带传送带Q0.1
SB3急停按钮I0.2吸盘Q0.2
SB4复位按钮I0.3机械手Q0.3
S传感器传感器I0.4机械臂右转Q0.4
SQ1下降上升到位传感器I0.5机械臂左转Q0.5
SQ5左右转到位传感器I0.6L1灯指示灯Q0.6
SQ3抓起到位传感器I0.7L2灯指示灯Q0.7
SQ2料到位传感器I1.0L3灯指示灯Q1.0

L4灯指示灯Q1.1
L5灯指示灯Q1.2

 布置场景:

 场景这里自己建一下就可以了,要注意:虚拟工厂变量名和I/O分配一定要和博图中变量和名称的相同。建立好分配好后,就可以和博图仿真连接上了,注意要在主程序带上一个仿真驱动块,要不然连接不上。(如果没有的话可以在博主资源里面下载,然后导入进去就好啦!)

 




二、程序编写

 这里程序的控制可以分3个部分:机械手运行,启动停止,急停复位。

到这里我们其实可以知道要用什么语句来编写!case !对!机械手运行要一步一步来嘛,那case语句就比较合适啦!

1.机械手运行部分

好的,我们来开始这一部分的编写:

按下启动按钮,出料,传送带A启动,当S传感器检测到物体时,传送带A停止运行,1s后机械手左转,在左转到位后停1s,吸盘得电0.5s后,机械手下降,当抓取到物体1s后机械手上升,上升到位后延时1s右转,右转到位后1s,机械手下降,下降到位后延时0.5s,吸盘失电,同时机械手上升,当料到位传感器检测到物体时 得电,B传送带运行,运行3s后,同时机械臂左转回到原位,3s时间到后,B传动带停止,机械手进入下一循环,继续取料上料。

 这里我们一步一步走,按下启动后,传送带A启动,然后等待料到达传感器,到达后进行下一步,2,3,4,5,6,7,8,9就这样就将机械手部分大概完成了。到第10步时将中继复位然后进入一个循环就好了。 

T[0].TON(IN := #ZJ1,
          PT := T#0.5s);
#T[1].TON(IN := #ZJ2,
          PT := T#0.5s);
#T[2].TON(IN := #ZJ3,
          PT := T#0.5s);
#T[3].TON(IN := #ZJ4,
          PT := T#1s);
#T[4].TON(IN := #ZJ5,
          PT := T#1s);
#T[5].TON(IN := #ZJ6,
          PT := T#1s);
#T[6].TON(IN := #ZJ7,
          PT := T#0.5s);
#T[7].TON(IN := #ZJ8,
          PT := T#1s);
#T[8].TON(IN := #ZJ9,
          PT := T#0.5s);

CASE #M OF
    0:
        IF "启动" THEN
            "A传送带" := 1;          
            #M := 1;
        END_IF;
        
    1:
        IF "S传感器" THEN
            "A传送带" := 0;
            "B传送带" := 0;
            #ZJ1 := 1;
        END_IF;
        IF #T[0].Q THEN
            #M := 2;
        END_IF;
    2:
        "机械臂左转" := 1;
        IF "SQ5左右转到位" THEN
            #ZJ2 := 1;
        END_IF;
        IF #T[1].Q THEN
            "机械臂左转" := 0;
            #M := 3;
        END_IF;
    3:
        "吸盘" := 1;
        "机械手" := 1;
        IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
            #ZJ3 := 1;
        END_IF;
        IF #T[2].Q THEN
            #M := 4;
        END_IF;
    4:
        "机械手" := 0;
        #ZJ4 := 1;
        IF #T[3].Q THEN
            "机械臂右转" := 1;
            #ZJ5 := 1;
        END_IF;
        IF #T[4].Q THEN
            "机械臂右转" := 0;
            #M := 5;
        END_IF;
    5:
        "机械臂右转" := 1;
        #ZJ6 := 1;
        IF #T[5].Q THEN
            #M := 6;
        END_IF;
    6:
        "机械臂右转" := 0;
        "机械手" := 1;
        IF "SQ1下降上升到位" & "吸盘" THEN
            #ZJ7 := 1;
        END_IF;
        IF #T[6].Q THEN
            "吸盘" := 0;
            
            #M := 7;
        END_IF;
    7:
        
        IF "SQ1下降上升到位" THEN
            
            "机械手" := 0;
            #ZJ8 := 1;
            #M := 8;
        END_IF;
    8:
        IF #T[7].Q  THEN
            "机械臂左转" := 1;
            #ZJ9 := 1;
            #M := 9;
        END_IF;       
    9:
        IF "SQ2料到位" THEN
            "B传送带" := 1;
        END_IF;
        
        IF #T[8].Q THEN
            "机械臂左转" := 0;
            "A传送带" := 1;           
            #M := 10;
        END_IF;
 10:
    
        "机械臂左转" := 0;
        #ZJ1 := 0;
        #ZJ2 := 0;
        #ZJ3 := 0;
        #ZJ4 := 0;
        #ZJ5:= 0;
        #ZJ6 := 0;
        #ZJ7 := 0;
        #ZJ8 := 0;
        #ZJ9 := 0;
        #M := 1;

当然这里还有一点小问题,我们先看过程序运行效果!

这里我们可以发现在上料时,是每过一个循环后上料,速度可能会稍慢一些!

我们改进一下,将上料的部分放在case语句外面,这样只要机械手拿走料,就会自动补齐! 

代码如下:按下启动按钮后接通一个标志位,用if 语句来判断S传感器当前的状态然后取反就可以实现啦!例:S传感器为0是,取反赋值给A传送带,A传送带为1,开始进料;当S传感器为1时,取反变为0然后赋值给A传送带,A传送带就停止了! 

 //启动按钮
    IF "启动" THEN
        #标志1 := 1;
        #M := 1;
    END_IF;
    IF #标志1 THEN
        "A传送带" :=NOT "S传感器";
    END_IF;

 传送带部分提出来后,后面的程序代码要稍微修改一下!

代码如下:

 有一些地方重新修改了一下。

 CASE #M OF
            
        1:
            IF "S传感器" THEN
                "B传送带" := 0;
                #M := 2;
            END_IF;
        2:
            #ZJ1 := 1;
            IF #T[0].Q THEN
                #M := 3;
            END_IF;
        3:
            "机械臂左转" := 1;
            //"L5灯" := 1;
            IF "SQ5左右转到位" THEN
                #ZJ2 := 1;
            END_IF;
            IF #T[1].Q THEN
                "机械臂左转" := 0;
                // "L5灯" := 0;
                #M := 4;
            END_IF;
        4:
            "吸盘" := 1;
            //"L3灯" := 1;
            #ZJ3 := 1;
            IF #T[2].Q THEN
                // "L1灯" := 1;
                "机械手" := 1;
            END_IF;
            IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
                #ZJ4 := 1;
                // "L1灯" := 0;
            END_IF;
            IF #T[3].Q THEN
                //"L2灯" := 1;
                "机械手" := 0;
                #M := 5;
            END_IF;
        5:
            IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
                #ZJ5 := 1;
                // "L2灯" := 0;
            END_IF;
            IF #T[4].Q THEN
                "机械臂右转" := 1;
                #ZJ6 := 1;
                
            END_IF;
            IF #T[5].Q THEN
                "机械臂右转" := 0;
                #M := 6;
            END_IF;
        6:
            "机械臂右转" := 1;
            #ZJ7 := 1;
            IF #T[6].Q THEN
                #M := 7;
            END_IF;
        7:
            "机械臂右转" := 0;
            #ZJ8 := 1;
            IF "吸盘" THEN
                IF #T[7].Q THEN
                    "机械手" := 1;
                    #ZJ9 := 1;
                    #M := 8;
                END_IF;
            END_IF;
        8:
            IF #T[8].Q THEN
                "吸盘" := 0;
                "机械手" := 0;
                #ZJ10 := 1;
            END_IF;
            IF #T[9].Q THEN
                #M := 9;
            END_IF;
        9:
            IF "SQ2料到位" THEN
                "B传送带" := 1;
                "机械臂左转" := 1;
                #ZJ11 := 1;
                #M := 10;
            END_IF;
        10:
            IF #T[10].Q THEN
                "机械臂左转" := 0;
                #ZJ12 := 1;
                #M := 11;
            END_IF;
        11:
            
            IF #T[11].Q  THEN
                #ZJ1 := 0;
                #ZJ2 := 0;
                #ZJ3 := 0;
                #ZJ4 := 0;
                #ZJ5 := 0;
                #ZJ6 := 0;
                #ZJ7 := 0;
                #ZJ8 := 0;
                #ZJ9 := 0;
                #ZJ10 := 0;
                #ZJ11 := 0;
                #ZJ12 := 0;
                #M := 1;
            END_IF;
            
    END_CASE;

 好的,现在我们再来看效果是否可以!

这里我们可以看到,效果实现了! 

 


 

2.启动停止部分

好的!主要控制我们已经完成,下面就是启动停止部分!

 2.在程序运行时如果按下停止按钮,程序会在循环完一次后回到原位停止操作,并且可以再次启动运行。

 这里它要求,按下后运行一次后停止!到这里大家可以想一想要如何实现这个功能(实现方法可以放在评论区,大家一起讨论)

这里我用的是一个if 判断,在运行到最后一步的时候我们判断是否按下了停止按钮,如果按下就停止,没有按下就继续循环。

按下后再判断系统是否在运行,代码如下:按下后如果成立就将w赋值为1。

//停止按钮
IF "停止" THEN
    IF #标志1 & "A传送带" OR #标志1 & "B传送带" OR #标志1 & "机械臂左转" OR #标志1 & "机械臂右转" OR #标志1 & "机械手" OR #标志1 & "吸盘" OR #标志1 & "SQ1下降上升到位" OR
        #标志1 & "SQ2料到位" OR #标志1 & "SQ3抓起到位" OR #标志1 & "SQ5左右转到位" OR #标志1 & "S传感器" THEN
        #W := 1;
    END_IF;
END_IF;

程序在运行到最后一步时,来判断w是否是1,是1就停止,等待下次启动被按下;不是1就继续循环。

 //判断是否按下停止
11:
            
            IF #T[11].Q & #W = 1 THEN
                "B传送带" := 0;
                #ZJ1 := 0;
                #ZJ2 := 0;
                #ZJ3 := 0;
                #ZJ4 := 0;
                #ZJ5 := 0;
                #ZJ6 := 0;
                #ZJ7 := 0;
                #ZJ8 := 0;
                #ZJ9 := 0;
                #ZJ10 := 0;
                #ZJ11 := 0;
                #ZJ12 := 0;
                #M := 0;
                #标志1 := 0;
            END_IF;
            IF #T[11].Q & #W = 0 THEN
                #ZJ1 := 0;
                #ZJ2 := 0;
                #ZJ3 := 0;
                #ZJ4 := 0;
                #ZJ5 := 0;
                #ZJ6 := 0;
                #ZJ7 := 0;
                #ZJ8 := 0;
                #ZJ9 := 0;
                #ZJ10 := 0;
                #ZJ11 := 0;
                #ZJ12 := 0;
                #M := 1;
            END_IF;

这里我们也来试一下效果:

 


3.急停复位部分

最后的最后就是我们的急停复位部分啦!在实际生成中如果出现紧急情况,急停按钮非常非常的重要!这里我们就来编写一下!(大家如果有好的想法和思路可以在评论区讨论哦!) 

 3.在程序运行时如果按下急停按钮,程序动作立即停止,当按下复位按钮后程序才能继续运行,在急停期间其他按钮无效。

 这里我写的是将机械手运行那部分断开(和开路差不多),按下复位后再闭合,程序还可以继续运行!代码如下:

按下后标志2得电,将机械手部分断开!

//急停按钮
IF "急停按钮" THEN
    #标志2 := 1;
    "A传送带" := 0;
    
END_IF;
IF NOT #标志2 THEN

case  of

               //在case外面加一个标志2的取反
end_case;

end_if;

 复位的时候再闭合就可以了!(这里因为A传送带不在case里面,所以放在这里进行停止了)

//复位按钮
IF "复位按钮" THEN
    #标志2 := 0;
    "A传送带" := 1;
   
END_IF;

 好的!我们看下效果如何:

      可以完成急停要求!


 三、完整代码

 

//停止按钮
IF "停止" THEN
    IF #标志1 & "A传送带" OR #标志1 & "B传送带" OR #标志1 & "机械臂左转" OR #标志1 & "机械臂右转" OR #标志1 & "机械手" OR #标志1 & "吸盘" OR #标志1 & "SQ1下降上升到位" OR
        #标志1 & "SQ2料到位" OR #标志1 & "SQ3抓起到位" OR #标志1 & "SQ5左右转到位" OR #标志1 & "S传感器" THEN
        #W := 1;
    END_IF;
END_IF;


//急停按钮
IF "急停按钮" THEN
    #标志2 := 1;
    "A传送带" := 0;
    
END_IF;

//复位按钮
IF "复位按钮" THEN
    #标志2 := 0;
    //"B传送带" := 1;
    "A传送带" := 1;
   
END_IF;

//接通延时定时器部分
#RTRIG[0](CLK := "S传感器");
#T[0].TON(IN := #ZJ1,
          PT := T#0.5s);
#T[1].TON(IN := #ZJ2,
          PT := T#0.5s);
#T[2].TON(IN := #ZJ3,
          PT := T#0.5s);
#T[3].TON(IN := #ZJ4,
          PT := T#0.5s);
#T[4].TON(IN := #ZJ5,
          PT := T#1s);
#T[5].TON(IN := #ZJ6,
          PT := T#1s);
#T[6].TON(IN := #ZJ7,
          PT := T#0.5s);
#T[7].TON(IN := #ZJ8,
          PT := T#0.5s);
#T[8].TON(IN := #ZJ9,
          PT := T#1s);
#T[9].TON(IN := #ZJ10,
          PT := T#1s);
#T[10].TON(IN := #ZJ11,
           PT := T#1s);
#T[11].TON(IN := #ZJ12,
           PT := T#2s);
IF NOT #标志2 THEN
    //启动按钮
    IF "启动" THEN
        #标志1 := 1;
        #W := 0;
        #M := 1;
    END_IF;
    IF #标志1 THEN
        "A传送带" :=NOT "S传感器";
    END_IF;
    
    //指示灯部分
    IF #标志1 THEN
        IF "机械手" THEN
            "L1灯" := 1;
            "L2灯" := 0;
        ELSE
            "L2灯" := 1;
            "L1灯" := 0;
        END_IF;
    END_IF;
    IF "吸盘" THEN
        "L3灯" := 1;
    ELSE
        "L3灯" := 0;
    END_IF;
    IF "机械臂左转" THEN
        "L5灯" := 1;
    ELSE
        "L5灯" := 0;
    END_IF;
    IF "机械臂右转" THEN
        "L4灯" := 1;
    ELSE
        "L4灯" := 0;
    END_IF;
END_IF;
//机械手执行动作部分
IF NOT #标志2 THEN
    CASE #M OF
            
        1:
            IF "S传感器" THEN
                "B传送带" := 0;
                #M := 2;
            END_IF;
        2:
            #ZJ1 := 1;
            IF #T[0].Q THEN
                #M := 3;
            END_IF;
        3:
            "机械臂左转" := 1;
            //"L5灯" := 1;
            IF "SQ5左右转到位" THEN
                #ZJ2 := 1;
            END_IF;
            IF #T[1].Q THEN
                "机械臂左转" := 0;
                // "L5灯" := 0;
                #M := 4;
            END_IF;
        4:
            "吸盘" := 1;
            //"L3灯" := 1;
            #ZJ3 := 1;
            IF #T[2].Q THEN
                // "L1灯" := 1;
                "机械手" := 1;
            END_IF;
            IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
                #ZJ4 := 1;
                // "L1灯" := 0;
            END_IF;
            IF #T[3].Q THEN
                //"L2灯" := 1;
                "机械手" := 0;
                #M := 5;
            END_IF;
        5:
            IF "SQ1下降上升到位" & "SQ3抓起到位" THEN
                #ZJ5 := 1;
                // "L2灯" := 0;
            END_IF;
            IF #T[4].Q THEN
                "机械臂右转" := 1;
                #ZJ6 := 1;
                
            END_IF;
            IF #T[5].Q THEN
                "机械臂右转" := 0;
                #M := 6;
            END_IF;
        6:
            "机械臂右转" := 1;
            #ZJ7 := 1;
            IF #T[6].Q THEN
                #M := 7;
            END_IF;
        7:
            "机械臂右转" := 0;
            #ZJ8 := 1;
            IF "吸盘" THEN
                IF #T[7].Q THEN
                    "机械手" := 1;
                    #ZJ9 := 1;
                    #M := 8;
                END_IF;
            END_IF;
        8:
            IF #T[8].Q THEN
                "吸盘" := 0;
                "机械手" := 0;
                #ZJ10 := 1;
            END_IF;
            IF #T[9].Q THEN
                #M := 9;
            END_IF;
        9:
            IF "SQ2料到位" THEN
                "B传送带" := 1;
                "机械臂左转" := 1;
                #ZJ11 := 1;
                #M := 10;
            END_IF;
        10:
            IF #T[10].Q THEN
                "机械臂左转" := 0;
                #ZJ12 := 1;
                #M := 11;
            END_IF;
        11:
            
            IF #T[11].Q & #W = 1 THEN
                "B传送带" := 0;
                #ZJ1 := 0;
                #ZJ2 := 0;
                #ZJ3 := 0;
                #ZJ4 := 0;
                #ZJ5 := 0;
                #ZJ6 := 0;
                #ZJ7 := 0;
                #ZJ8 := 0;
                #ZJ9 := 0;
                #ZJ10 := 0;
                #ZJ11 := 0;
                #ZJ12 := 0;
                #M := 0;
                #标志1 := 0;
            END_IF;
            IF #T[11].Q & #W = 0 THEN
                #ZJ1 := 0;
                #ZJ2 := 0;
                #ZJ3 := 0;
                #ZJ4 := 0;
                #ZJ5 := 0;
                #ZJ6 := 0;
                #ZJ7 := 0;
                #ZJ8 := 0;
                #ZJ9 := 0;
                #ZJ10 := 0;
                #ZJ11 := 0;
                #ZJ12 := 0;
                #M := 1;
            END_IF;
            
    END_CASE;
    
END_IF;

 



 

总结

以上就是本篇文章的内容啦!我们一起编写了机械手的控制部分,停止部分和急停部分!感谢大家的观看,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue中 引入使用 babel-polyfill 兼容低版本浏览器

注意:本文主要介绍的 vue-cli 版本:3.x, 4.x; 最近在项目中使用 webpack 打包后升级,用户反馈使用浏览器(chrome 45)访问白屏。经过排查发现:由于 chrome 45 无法兼容 ES6 语法导致的…

linux018之安装mysql

linux上安装mysql: 第一步:查看是否已经安装mariadb,mariadb是mysql数据库的分支,mariadb和mysql一起安装会有冲突,所以需要卸载掉。 yum list installed | grep mariadb :查看是否安装mariadb,…

「可信计算」论文初步解读

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

数据结构与算法

1、复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。(1)为什么需要复杂度分析&…

Github 学生优惠包 -- 最新防踩坑指南

Github学生优惠包的申请最近越来越麻烦,里面有非常多的坑,留下此文防止各位申请的时候踩到。 此文面向中国大陆真正有学生身份的同学!!! 文章目录前言1.用到的网址2.申请所需3.详细步骤4.踩坑点前言 记得在一年以前还…

进程的概念

进程的概念 程序的概念 这里说的是一个可执行文件,passive的意思可以理解为我们这个执行文件需要我们进行双击才会被被执行。 双击后,程序入口地址读入寄存器,程序加载入主存,成为一个进程 进程是主动去获取想要的资源&#xff0…

图解LeetCode——剑指 Offer 10- II. 青蛙跳台阶问题

一、题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97(1000000007),如计算初始结果为:1000000008,请返回 1。 二、示例 2.1>…

inno setup打包软件学习

目录 一 打包结果 二 示例打包脚本 三 错误解决 3.1 另一个程序正在使用此文件,进程无法访问 3.2 桌面图标无法修改 四 参考资料 一 打包结果 测试程序来自: 泽森科工 (zenustech.com) 二 示例打包脚本 使用打包软件下载地址: in…

[U3D ShaderGraph] 全面学习ShaderGraph节点 | 第四课 | Input/Lighting

📣📣📣本专栏所有内容在完结之前全部为试读模式,专栏完结之后会取消试读模式,如果感觉内容还不错的话请支持一下📣📣📣 ShaderGraph是可视化的着色器编辑工具。您可以使用此工具以可视方式创建着色器。 本专栏可以让你更了解ShaderGraph中每个节点的功能,更自如的…

BUUCTF Reverse xor

题目:BUUCTF Reverse xor 一些犯傻后学到了新东西的记录 查壳,没壳,IDA打开 main函数很好理解,输入一个长度为33的字符串,1-32位与前一位异或后与global相等,则判定flag正确 找global 在strings window直…

【Java】《Java8 实战》 CompletableFuture 学习

文章目录前言1. 并发(Concurrent) 和 并行(Parallel)1.1 并发的来源1.2 并发技术解决了什么问题2. 并行的来源2.1 并行解决了什么问题3. CompletableFuture 简介4. CompletableFuture 简单应用5. CompletableFuture 工厂方法的应用6. CompletableFuture join() 方法7. 使用 Par…

2022黑马Redis跟学笔记.实战篇(七)

2022黑马Redis跟学笔记.实战篇 七4.11.附近的店铺功能4.11.1. GEO数据结构的基本用法1. 附近商户-导入店铺数据到GEO4.11.2. 获取附近的店铺1. 附近商户-实现附近商户功能4.9. 签到功能4.9.1.BitMap原理1. 用户签到-BitMap功能演示4.9.2.实现签到功能4.9.3.实现补签功能4.9.4.统…

.net开发安卓入门-自动升级(配合.net6 webapi 作为服务端)

文章目录思路客户端权限清单(AndroidManifest.xml)权限列表(完整内容看 权限清单(AndroidManifest.xml))打开外部应用的权限(完整内容看 权限清单(AndroidManifest.xml))添加文件如下…

网络数据包接收流程

1. 网络数据包接收流程简述 典型的以太网卡网络包接收流程如下: 1.网络包通过物理介质传到接收端的phy芯片; 2.phy芯片通过RGMII协议传到MAC芯片rx queue fifo中; 3.MAC芯片通过专用DMA将网络包搬运到网卡驱动程序预先分配好的rx ringbuffer中…

【多线程与高并发】- synchronized锁的认知

synchronized锁的认知 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 一个有梦有戏的人 怒放吧德德 🌝分享学习心得,欢迎指正&#xf…

言简意赅+图解 函数传参问题(传值、传地址 500字解决战斗)

1、传值 2、传地址 不论是传值,还是传地址,形参都是对于实参的一份拷贝 下图为按值传递进行交换: 形参left拷贝一块新空间,形参right拷贝一块新空间 下图为按指针传递进行交换 形参left拷贝一块新的空间,形参right…

研究生薪资管理系统-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-5】研究生薪资管理系统 【案例介绍】 案例描述 在学校中,学生每个月需要交相应的生活费,老师每个月有相应的工资,而在职研究生既是老师又是学生,所以在职研究生既需要交学费又会有工资。下面要求编写一个程序来统计在职…

最完整的小红书带货笔记——垂直模式

最完整的小红书带货笔记——垂直模式,小红书直播复盘怎么做?#直播带货笔记 第1篇,带你解锁直播复盘5大要点! #小红书店铺#小红书运营 小红书怎么发带货笔记? 做小红书带货的同学注意了,我们带货一定要发笔…

看见统计——第三章 概率分布

看见统计——第三章 概率分布 参考 https://github.com/seeingtheory/Seeing-Theory中心极限定理 概率分布描述了随机变量取值的规律。 随机变量Random Variables 🔥 定义:将样本空间中的结果映射到实数的函数 XXX 称为随机变量(random variable)&a…

【算法基础】链表

一、单链表例题:实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第 k个插入的数后面的数;在第 k� 个插入的数后插入一个数。现在要对该链表进行 M次操作,进行完所…