我的这一款是 6 大核 8 小核 20 线程设计。默认情况下启动虚拟机资源分配是交给 windows 主机自己协调的,很可能会分配给小核运行虚拟机导致运行卡顿,资源管理器可以看到 cpu 负载都在后面的小核上:
解决方法就是以管理员权限运行 vmware,这样 VMware 会自己调度资源使用,优先级大概是大核>小核>超线程。实际效果很明显,基本都运行在了大核上:
小版本升级,例如 19.05-> 19.07。
这种小版本的升级最方便的就是通过 Attended Sysupgrade 功能,可以保留已安装的包和系统设置。最大限度地无缝过渡。官方介绍:https://openwrt.org/docs/guide-user/installation/attended.sysupgrade
需要先安装 Attended Sysupgrade luci 界面包:
opkg install luci-app-attendedsysupgrade
建议使用此功能前依然做一次数据备份。
然后重新登录 luci,在 system - Attended Sysupgrade 找到入口,点击 search for firmware upgrade 即可在线搜索可更新的系统。
最方便的就是通过 luci 界面升级系统,目前支持直接升级的大版本顺序是:19.07 > 21.02 > 22.03 > 23.05。
openwrt 21:https://openwrt.org/releases/21.02/notes-21.02.0
openwrt 22:https://openwrt.org/releases/22.03/notes-22.03.0
openwrt 23:https://openwrt.org/releases/23.05/notes-23.05.0
每个版本升级实际上就是重新刷入了一次固件,所以之前的配置文件什么的基本上都会被覆盖,所以系统内修改过的配置最好做一次备份。
打开 luci 界面,选择 system - backup/flash firmware,在 configuration 菜单栏中将需要保存的文件或目录定义出来,然后在 action 菜单栏中选择 backup - generate archive 即可保存备份到本地。
可以通过 awk 脚本识别出自己手动安装的包列表,方便更新系统后安装回去,下载脚本:https://github.com/richb-hanover/OpenWrtScripts/blob/main/opkgscript.sh
执行以下命令会保存已安装的包列表到 /etc/config/opkg.installed:
opkgscript.sh -v write
执行以下命令会识别并安装 /etc/config/opkg.installed 列表中的包:
opkgscript.sh -v install
也可以执行以下 awk 脚本可以单独列出自己手动安装的包列表:
#!/usr/bin/awk -f
BEGIN {
ARGV[ARGC++] = "/usr/lib/opkg/status"
cmd="opkg info busybox | grep '^Installed-Time: '"
cmd | getline FLASH_TIME
close(cmd)
FLASH_TIME=substr(FLASH_TIME,17)
}
/^Package:/{PKG= $2}
/^Installed-Time:/{
INSTALLED_TIME= $2
# Find all packages installed after FLASH_TIME
if ( INSTALLED_TIME > FLASH_TIME ) {
cmd="opkg whatdepends " PKG " | wc -l"
cmd | getline WHATDEPENDS
close(cmd)
# If nothing depends on the package, it is installed by user
if ( WHATDEPENDS == 3 ) print PKG
}
}
EOF
保存以上内容到 listuserpackages.awk 文件中并执行即可列出用户自行安装包列表。
x86 版本的 openwrt 的升级固件就是全新安装时候用的固件,直接在官网下载需要版本的 gz 压缩包即可。
下载地址:https://downloads.openwrt.org/releases/
我下载的是:generic-ext4-combined.img.gz,注意不要解压出来,保留压缩包即可。
进入 luci 的 system - backup/flash firmware 选择 Flash image ,然后选择刚才下载的压缩包即可上传更新,会提示是否保留设置和配置,跨大版本的升级必须取消选择保留数据,否则可能升级失败:
如果升级后卡在 grub 界面说明可能是由于选择了保留配置导致升级失败了,可以参考官方教程通过 failsafe mode 恢复默认配置:Failsafe mode, factory reset, and recovery mode,或者直接重新安装系统。
稍等几分钟安装好后你可能会发现 luci 无法在局域网中访问了,这是由于新安装的固件恢复了 network 配置,需要直接到 openwrt 设备上配置网络。
配置教程参考:openwrt network 配置
配置好网络后在局域网设备中可以用 ssh 登录了,此时会发现提示:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:U9XODs/7A4k065pxSMyEtQ2m98v2P0bf/ML0MfzU.
Please contact your system administrator.
Add correct host key in C:\\Users\\Marco Nie/.ssh/known_hosts to get rid of this message.
Offending RSA key in C:\\Users\\Marco Nie/.ssh/known_hosts:6
Host key for 192.168.244.1 has changed and you have requested strict checking.
Host key verification failed.
这是由于更新系统后 ssh 指纹发生了变化,需要删除本地缓存的 openwrt 设备的指纹在登陆,windows 系统 ssh 指纹保存地址为当前用户目录下的 .ssh 文件夹。
升级后可以通过之前的脚本列出的已安装包的列表将自己需要的包安装回去,同时将备份数据按照新系统的格式恢复回去。
从 openwrt 21 开始修改了 network 配置文件格式,参考:https://blog.niekun.net/archives/2291.html
从 openwrt 22 开始替换 iptables 为 nftables,需要原始工具的话可以自行安装回去:opkg install iptables
compgen -u
compgen -g
sudo usermod -a -G groupName userName
newgrp groupName
sudo usermod -G groupName userName
newgrp groupName
用户和组对文件的权限管理参考:chown 和 chmod 管理文件权限
]]>/etc/passwd
文件最后按照格式增加一个用户即可,然后可以修改这个新用户的密码。下面使用一条命令快速添加新用户:
grep -qw new_user /etc/passwd || echo "new_user:x:0:23333:::" >> /etc/passwd
命令先检查是否在文件中存在需要添加的用户名,如果不存在则在文件最后一行添加用户。
其中 new_user 是用户名,0 是 uid,23333 是 gid。
如果需要修改这个新用户的密码,执行命令即可:
passwd new_user
以上就是创建新用户简单方法。
]]>$ ip address | grep -w inet | awk '{print $2}'
127.0.0.1/8
192.168.122.2/24
172.18.0.1/16
172.17.0.1/16
172.19.0.1/16
]]>可以自己修改快捷方式的属性来建立一个以快捷方式所在地址为准的指向一个相对路径的文件。这样适用于需要同时移动原始文件与快捷方式的情况。
首先右键创建一个文件的快捷方式,然后右键选择快捷方式的属性,将目标位置地址改为:explorer.exe path/to/file.exe
。注意 explorer.exe 后面的空格:
后面的路径就是相对于快捷方式地址的相对路径。
确认后默认快捷方式图标会变成资源管理器的图标,可以在属性里修改为其他图标。
]]>下面举一个例子说明:
{attribute 'qualified_only'} // 必须先写类型名称再写属性名称 (例如 eColor.Red)
// {attribute 'strict'} //取消 'strict' 以允许转换 UDINT 数据类型
{attribute 'to_string'} // 运行字符串转换 (例如 TO_STRING(eColor.Red) = 'Red')
TYPE eColor :
(
Red := 16#FFFF0000,
Green := 16#FF00FF00,
Blue := 16#FF0000FF
Yellow := 16#FFFFFF00,
) UDINT; // 声明 UDINT 作为 int 整形类型
END_TYPE
// 定义一些变量
ColorVar1 : eColor;
ColorVar2 : eColor;
ColorName : STRING;
ColorValue : UDINT;
ColorVar1 := eColor.Green; // ColorVar1 = 16#FF00FF00
ColorName := TO_STRING(ColorVar1); // ColorName = 'Green';
ColorValue := TO_UDINT(ColorVar1); // ColorValue = 16#FF00FF00
ColorVar2 := 16#FF00FF00; // ColorVar2.Green
ColorName := TO_STRING(ColorVar2); // ColorName = 'Green';
ColorValue := TO_UDINT(ColorVar2); // ColorValue = 16#FF00FF00
ColorVar1 := ColorVar2 OR eColor.Red; // 按位相与得到 Yellow=16#FFFFFF00
ColorName := TO_STRING(ColorVar1); // ColorName = 'Yellow';
ColorValue := TO_UDINT(ColorVar1); // ColorValue = 16#FFFFFF00
以上示例列举了常用的 enum 类型可进行的数据交互方式。
eColor.Green
可以获取enum类型属性的值,并可以赋值给其他对应 enum 实例TO_STRING(ColorVar1)
可以转换获取 enum 实例当前值对应属性名称字符串
下载时出现此报警,原因是 task 任务中对 gou 的排序有问题,放在前面的 pou 中使用了后面 pou 才设定好的数据,需要重新排列 task 任务序列:
mc_power
mc_jog
等控制轴的功能块,一运行就报错 SMC_FB_CALLED_FROM_WRONG_TASK,可能是不同的 pou 放在了多个 task 任务中,循环中内部有了冲突,将所有的 pou 放在同一个 task 中就可以解决问题。
GitHub 主页:https://github.com/immich-app/immich
官网教程:https://immich.app/docs/overview/introduction/
使用 docker compose 安装,新建一个 immich 文件夹,下载 docker-compose.yml 和 .env 文件到文件夹:
wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
打开 .env 文件配置环境变量,主要就是配置备份路径和数据库密码,修改 UPLOAD_LOCATION 和 DB_PASSWORD。
启动容器:
docker compose up -d
后续更新只需要进入 immich 文件夹执行下面命令即可:
docker compose pull && docker compose up -d
docker-compose.yml 文件中默认将 3001 端口映射到了本地 2283 端口,3001就是服务端访问端口号。
下面是所有可用的端口,根据需要可以修改 docker-compose 文件映射到本地:
PORT | Web Port | 3000 | web |
SERVER_PORT | Server Port | 3001 | server |
MICROSERVICES_PORT | Microservices Port | 3002 | microservices |
MACHINE_LEARNING_HOST | Machine Learning Host | 0.0.0.0 | machine learning |
MACHINE_LEARNING_PORT | Machine Learning Port | 3003 | machine learning |
网页端访问:http://you.machine.ip:2283 进入配置页面,根据提示建立一个管理员账户,后续可以在管理员账户中建立其他子账户供其他人使用。
下载手机端 app,ios 直接在 app store 搜索 immich 下载,安卓在 github 发布页下载 apk:https://github.com/immich-app/immich/releases
在手机端输入以下网址进入:http://you.machine.ip:2283/api
然后就可以配置需要备份的手机端图片文件夹了。
服务器在本地,如果要外网域名远程访问图库,需要一些额外的配置,我这里是通过 cloudflare 配置子域名,nginx 配置反向代理到 frps,最后本地服务器 frpc 配置本地 2283 端口绑定到远程域名访问即可。
可以参考我之前的关于 frp 的教程:https://blog.niekun.net/archives/539.html
]]>主要步骤为:
首先需要配置工控机啊 BIOS 设置,将一些超线程,电源管理等选项关掉:
关闭BIOS 中激活的所有节能选项
停用可能导致系统管理中断的所有内容
然后就可以安装 RTE,官网下载需要的 runtime 安装包,注意区分 x86 还是 x64 设备。我下载的是 **CODESYS Control RTE SL (×86Windows 实时)。
官网下载地址:http://store.codesys.cn/codesys/store/index.html
在工控机上解压并安装需要的 RTE runtime,基本都是直接下一步即可,期间注意选择带不带 softmotion:
Control RTE 文件路径:C:\Program Files\CODESYS\CODESYS Control RTE3
Control RTE 安装路径:C:\ProgramData\CODESYS\CODESYSControlRTEV3
支持的网卡:
Systems with Windows and CODESYS Control RTE (Real-time SoftPLC):
一般情况下 intel 的千兆网卡都可以安装 CmpEt1000Drv 驱动。
首先进入设备管理器,选择需要更新 codesys 驱动的网卡,右键选择更新驱动:
选择从本地查找驱动程序:
选择从磁盘安装,从 RTE 文件路径找到对应的驱动目录并安装:
右键选择 plc configuration:
在 components manager 中在最后一个空行中填入安装的驱动名称,这里我填的是 CmpEt1000Drv:
确定并重启 plc 即可完成网卡驱动的安装及配置。
在codesys 开发项目中进行以下操作。
以上就是 RTE runtime 版添加 ethercat master 主站的简单方法。