首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >AI自动生成PLC代码,Google Antigravity初体验!关键能免费用Gemini和Claude!(含网络配置+软件安装步骤)

AI自动生成PLC代码,Google Antigravity初体验!关键能免费用Gemini和Claude!(含网络配置+软件安装步骤)

作者头像
Hello工控
发布2026-03-09 13:15:21
发布2026-03-09 13:15:21
4090
举报
文章被收录于专栏:Hello工控Hello工控

在Google最开始发布Antigravity的时候,就了解到个人可以体验到免费的Gemini和Claude顶级大模型。目前主要的模型已经支持:

主要包含最新的Gemini3.1、Claude 4.6 还有GPT OSS 120B这几个模型。

但是因为众所周知的原因,导致国内无法正常使用Google里的所有内容。

所以,这对于大部分人来说是个难题。我们这期分享下怎么使用Google的Antigravity,当然解决了这些Gemini官网、Google AI Studio、notebookLM就都能使用了。

正常使用就是一句话:良好的网络代理+TUN+全局+地理位置(建议:美国)

01

网络

正常来说,国内有很多网络工具可以正常访问的,在搜索引擎上可以搞定。最开始用了一些免费的网络节点,有些卡还限制时间。

所以建议搞个稳定的网络工具。我这里用的是虚拟主机+网络客户端工具方案:

注意:需要开启TUN和全局模式

02

地理位置

搞定网络后,可能有些朋友还是不能正常访问,主要原因:Google Antigravity的地理位置要求,该工具对用户Google账号的‌地区关联‌有严格限制,并非单纯依赖IP地址,而是需要账号本身与特定国家/地区绑定。

  1. 账号地区必须为支持地区‌:这是使用Antigravity的‌最关键前提‌。多个来源指出,账号关联地区必须为‌美国‌或‌新加坡‌。有用户成功将账号地区从香港更改为新加坡后顺利使用‌2。也有教程明确指出“地区必须为美国(非常关键)”‌。
  2. IP地址需与账号地区匹配‌:仅更改账号地区还不够,用户的‌网络IP地址‌也必须与账号地区一致。例如,如果账号地区已改为美国,那么访问Antigravity时的IP也必须是美国的IP地址,否则会因地理围栏机制而无法登录或持续加载‌。这通常需要通过科学上网工具(如TUN模式代理)来实现‌。
  3. 不支持的地区‌:账号关联地区为中国大陆、香港等地区时,会直接被拒绝访问‌。

如何查询地理位置

https://policies.google.com/terms

修改地理位置

如果不是美国地区,需要切换下,可以到下方地址申请更改:

https://policies.google.com/country-association-form

等几个小时后,就可以看到自己的位置切换成功了。

03

Antigravity安装

step1:下载安装包安装

官网地址:https://antigravity.google/download

我这里选择的是Windows版本,根据自己的电脑系统而定。

step2:直接找到安装包双击安装

选择我同意此协议继续:

等待安装,直到出现下方的安装完成消息框:

step3:直接双击打开即可进入下方界面:

04

Antigravity登录

我们打开后,软件需要一个Google的账户,

我们可以申请一个,没有的话刚好可以用配置好的网络环境申请。这里我们就不进行说明了,注册的官网地址:

https://accounts.google.com

注册完成后,在回到邮箱验证的环节,我们直接点击验证,他会调整到验证身份界面,当然这里有个短信验证环节,可以直接用+86国内的手机号码:

验证完成就会显示登录成功:

好了,接下来就可以开启在Antigravity里面进行聊天了:

我们简单的对它进行使用:

我们可以看到实际上和VS Code相似,只不过就是可以用这几个顶级模型:

这里以Claude为例来做简单示例,我们输入问题:

代码语言:javascript
复制
I want to Control a tank ,please give me st code !

它会思考一会,然后左侧打开后缀为.st的代码文档,具体代码我放下方:

代码语言:javascript
复制
(* ============================================================
  Program:     TankControl
  Description: Liquid Tank Fill / Empty Cycle Controller
  Language:    IEC 61131-3 Structured Text (ST)
  Author:      Auto-Generated
  Date:        2026-03-02
  ============================================================
  I/O Summary
  ───────────────────────────────────────────────────
  Inputs:
    bStart           : BOOL   – Start pushbutton (NO)
    bStop            : BOOL   – Stop / E-Stop pushbutton (NC)
    bManualMode      : BOOL   – Manual mode selector
    rLevelSensor     : REAL   – Analog level sensor 0-100 %
    bHighLevelSwitch : BOOL   – Discrete high-level limit switch
    bLowLevelSwitch  : BOOL   – Discrete low-level limit switch
  Outputs:
    bInletValve      : BOOL   – Inlet (fill) valve
    bOutletValve     : BOOL   – Outlet (drain) valve
    bMixerMotor      : BOOL   – Agitator / mixer motor
    bAlarmOut        : BOOL   – General alarm output
    bRunIndicator    : BOOL   – Running indicator lamp
  ============================================================
*)
PROGRAM TankControl
(* ── Variable Declarations ──────────────────────── *)
VAR_INPUT
    bStart           : BOOL;           (* Start button *)
    bStop            : BOOL;           (* Stop / E-Stop button *)
    bManualMode      : BOOL;           (* Manual mode switch *)
    rLevelSensor     : REAL;           (* Tank level 0..100 % *)
    bHighLevelSwitch : BOOL;           (* High level limit *)
    bLowLevelSwitch  : BOOL;          (* Low level limit *)
END_VAR
VAR_OUTPUT
    bInletValve      : BOOL;           (* Fill valve *)
    bOutletValve     : BOOL;           (* Drain valve *)
    bMixerMotor      : BOOL;           (* Mixer motor *)
    bAlarmOut        : BOOL;           (* Alarm *)
    bRunIndicator    : BOOL;           (* Run lamp *)
END_VAR
VAR
    (* ── State machine ── *)
    eState           : INT  := 0;      (* Current state *)
    ePrevState       : INT  := -1;     (* Previous state for edge detection *)
    (* ── Setpoints ── *)
    rFillSetpoint    : REAL := 90.0;   (* Fill target level % *)
    rDrainSetpoint   : REAL := 10.0;   (* Drain target level % *)
    rAlarmHigh       : REAL := 95.0;   (* High-level alarm % *)
    rAlarmLow        : REAL := 5.0;    (* Low-level alarm % *)
    (* ── Timers ── *)
    tonMixDelay      : TON;            (* Mixing duration timer *)
    tonFillTimeout   : TON;            (* Fill timeout timer *)
    tonDrainTimeout  : TON;            (* Drain timeout timer *)
    tMixDuration     : TIME := T
#30S
;  (* Mixing time *)
    tFillTimeout     : TIME := T
#120S
; (* Max fill time *)
    tDrainTimeout    : TIME := T
#120S
; (* Max drain time *)
    (* ── Counters ── *)
    nCycleCount      : DINT := 0;      (* Completed cycle counter *)
    (* ── Internal Flags ── *)
    bFaultActive     : BOOL := FALSE;  (* Latched fault flag *)
    bFaultReset      : BOOL := FALSE;  (* Fault reset request *)
    bStartEdge       : BOOL := FALSE;  (* Rising edge memory *)
    bStartPrev       : BOOL := FALSE;  (* Previous start value *)
END_VAR
(* ── State Constants ── *)
VAR CONSTANT
    ST_IDLE          : INT := 0;
    ST_FILLING       : INT := 1;
    ST_MIXING        : INT := 2;
    ST_DRAINING      : INT := 3;
    ST_COMPLETE      : INT := 4;
    ST_FAULT         : INT := 10;
END_VAR
(* ══════════════════════════════════════════════════
   MAIN LOGIC
   ══════════════════════════════════════════════════ *)
(* ── 1. Rising-edge detection on Start button ── *)
bStartEdge := bStart AND NOT bStartPrev;
bStartPrev := bStart;
(* ── 2. Fault Monitoring (always active) ──────── *)
IF rLevelSensor > rAlarmHigh AND eState <> ST_IDLE THEN
    bFaultActive := TRUE;    (* Over-fill protection *)
END_IF;
IF rLevelSensor < rAlarmLow AND eState = ST_DRAINING THEN
    bFaultActive := TRUE;    (* Over-drain protection *)
END_IF;
IF bHighLevelSwitch AND eState = ST_FILLING THEN
    bFaultActive := TRUE;    (* Discrete high-level trip *)
END_IF;
IF tonFillTimeout.Q OR tonDrainTimeout.Q THEN
    bFaultActive := TRUE;    (* Timeout fault *)
END_IF;
(* Emergency stop *)
IF NOT bStop THEN
    bFaultActive := TRUE;
END_IF;
(* Transition to FAULT state if any fault is active *)
IF bFaultActive AND eState <> ST_FAULT THEN
    eState := ST_FAULT;
END_IF;
(* ── 3. State Machine ────────────────────────── *)
CASE eState OF
    (* ─── IDLE ─────────────────────────────────── *)
    ST_IDLE:
        bInletValve   := FALSE;
        bOutletValve  := FALSE;
        bMixerMotor   := FALSE;
        bRunIndicator := FALSE;
        bAlarmOut     := FALSE;
        (* Reset timers *)
        tonFillTimeout(IN := FALSE, PT := tFillTimeout);
        tonDrainTimeout(IN := FALSE, PT := tDrainTimeout);
        tonMixDelay(IN := FALSE, PT := tMixDuration);
        (* Start condition: rising edge on Start, no fault *)
        IF bStartEdge AND NOT bFaultActive THEN
            eState := ST_FILLING;
        END_IF;
    (* ─── FILLING ──────────────────────────────── *)
    ST_FILLING:
        bInletValve   := TRUE;
        bOutletValve  := FALSE;
        bMixerMotor   := FALSE;
        bRunIndicator := TRUE;
        (* Fill timeout watchdog *)
        tonFillTimeout(IN := TRUE, PT := tFillTimeout);
        (* Transition when level reaches setpoint *)
        IF rLevelSensor >= rFillSetpoint THEN
            bInletValve := FALSE;
            tonFillTimeout(IN := FALSE, PT := tFillTimeout);
            eState := ST_MIXING;
        END_IF;
    (* ─── MIXING ───────────────────────────────── *)
    ST_MIXING:
        bInletValve   := FALSE;
        bOutletValve  := FALSE;
        bMixerMotor   := TRUE;
        bRunIndicator := TRUE;
        tonMixDelay(IN := TRUE, PT := tMixDuration);
        IF tonMixDelay.Q THEN
            bMixerMotor := FALSE;
            tonMixDelay(IN := FALSE, PT := tMixDuration);
            eState := ST_DRAINING;
        END_IF;
    (* ─── DRAINING ─────────────────────────────── *)
    ST_DRAINING:
        bInletValve   := FALSE;
        bOutletValve  := TRUE;
        bMixerMotor   := FALSE;
        bRunIndicator := TRUE;
        tonDrainTimeout(IN := TRUE, PT := tDrainTimeout);
        IF rLevelSensor <= rDrainSetpoint THEN
            bOutletValve := FALSE;
            tonDrainTimeout(IN := FALSE, PT := tDrainTimeout);
            nCycleCount := nCycleCount + 1;
            eState := ST_COMPLETE;
        END_IF;
    (* ─── COMPLETE ─────────────────────────────── *)
    ST_COMPLETE:
        bInletValve   := FALSE;
        bOutletValve  := FALSE;
        bMixerMotor   := FALSE;
        bRunIndicator := FALSE;
        (* Auto-restart or return to idle *)
        eState := ST_IDLE;
    (* ─── FAULT ────────────────────────────────── *)
    ST_FAULT:
        (* Safe state: all outputs off except alarm *)
        bInletValve   := FALSE;
        bOutletValve  := FALSE;
        bMixerMotor   := FALSE;
        bRunIndicator := FALSE;
        bAlarmOut     := TRUE;
        (* Fault acknowledged: operator presses Start while Stop is OK *)
        IF bStartEdge AND bStop THEN
            bFaultActive := FALSE;
            bAlarmOut    := FALSE;
            eState       := ST_IDLE;
        END_IF;
END_CASE;
END_PROGRAM

中途出了一次错,直接点retry即可继续:

总共输出了几个文档,还有说明:

基本上是一个很完整的项目了!

最后,有兴趣的朋友可以尝试下!

参考链接:

【1】https://blog.csdn.net/qq_75054867/article/details/158384293

【2】https://cloud.tencent.com/developer/article/2616155

阅读更多(戳下方图片)

图片
图片
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hello工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档